如题,我用Java的JAI打开一幅图像,但不知怎样在该图像上画矩形
关键代码如下:JFrame frame = new JFrame();
DisplayJAI dd = new DisplayJAI(image);
final JScrollPane sp = new JScrollPane(dd);
Container contentPane = frame.getContentPane();
contentPane.add(sp,BorderLayout.CENTER);
frame.setSize(500,600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);sp.addMouseListener(new MouseAdapter(){
                   @Override
                   public void mousePressed(MouseEvent e){
                        x1 = (int)e.getPoint().getX();
                        y1 = (int)e.getPoint().getY();
                   }                   @Override
                   public void mouseReleased( MouseEvent e ) {
                       x2 = (int)e.getPoint().getX();
                       y2 = (int)e.getPoint().getY();
                       x = Math.min( x1, x2 );
                       y = Math.min( y1, y2 );
                       w = Math.abs( x1 - x2 );
                       h = Math.abs( y1 - y2 );
                       sp.repaint();
                   }                   @Override
                   public void mouseDragged( MouseEvent e ) {
                       x2 = (int)e.getPoint().getX();
                       y2 = (int)e.getPoint().getY();
                       x = Math.min( x1, x2 );
                       y = Math.min( y1, y2 );
                       w = Math.abs( x1 - x2 );
                       h = Math.abs( y1 - y2 );
                       Rectangle rt = new Rectangle( x, y, w, h);
                       sp.repaint();
                }
});
// 如何实现这些repaint()?
// 在sp.addMouseListener(new MouseAdapter(){……})之前加入protected void paintComponent( Graphics g ){}  有错,无法实现repaint();  不知道怎么办好 了
先谢谢各位了!

解决方案 »

  1.   

    这个可以直接运行:import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.Shape;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JFrame;
    import javax.swing.JPanel;
    //这就是一个窗口
    public class Paint extends JFrame{
        
        public static void main( String[] args ) {
            new Paint();
        }
        
        public Paint() {
            getContentPane().add( new Canvas(null), BorderLayout.CENTER );
            
            setDefaultCloseOperation( EXIT_ON_CLOSE );
            setSize(500,600);
            setLocationRelativeTo( null );
            setVisible(true);
        }    
    }//这个类充当了一个画板的角色
    class Canvas extends JPanel{
        private List<Shape> shapes = new ArrayList<Shape>();
        private Image background = null;
        
        private Shape tmp = null;
        
        public Canvas (Image background) {
            this.background = background;
            AmouseListener al = new AmouseListener();
            this.addMouseListener( al );
            this.addMouseMotionListener( al );
        }
        
        //所有的作画操作在这里
        protected void paintComponent( Graphics g ) {
            super.paintComponent( g );
            g.setColor( Color.WHITE );
            if( background != null ) {
                int iWidth = background.getWidth( this );
                int iHeight = background.getHeight( this ); 
                g.drawImage( background, 0, 0, iWidth, iHeight, this );
            }else {
                g.fillRect( 0, 0, this.getWidth(), this.getHeight() );
            }
            g.setColor( Color.RED );
            Graphics2D g2 = (Graphics2D)g;
            for(int i=0;i<shapes.size();i++) {
                g2.draw( shapes.get( i ) );
            }
            
            if( tmp != null ) {
                g2.setColor( Color.BLUE );
                g2.draw( tmp );
                tmp = null;
            }
        }
        
        //监听鼠标事件的监听器
        class AmouseListener extends  MouseAdapter{
            private Point start = null;
            private Point end = null;
            
            public void mousePressed( MouseEvent e ) {
                start = e.getPoint();
            }        public void mouseReleased( MouseEvent e ) {
                end = e.getPoint();
                shapes.add( getRect( start, end ) );
                Canvas.this.repaint();
            }
            
            private Rectangle getRect(Point p1, Point p2) {
                int x1 = (int) p1.getX();
                int y1 = (int) p1.getY();
                int x2 = (int) p2.getX();
                int y2 = (int) p2.getY();
                int x = Math.min( x1, x2 );
                int y = Math.min( y1, y2 );
                int w = Math.abs( x1 - x2 );
                int h = Math.abs( y1 - y2 );
                Rectangle rt = new Rectangle(x,y,w,h);
                return rt;
            }        public void mouseDragged( MouseEvent e ) {            
                Rectangle rt = getRect( start, e.getPoint() );
                Canvas.this.tmp = rt;
                Canvas.this.repaint();
            }
        }
    }
      

  2.   

    谢谢这位大哥,你给的这个程序我也有。这个程序是用g.drawImage( background, 0, 0, iWidth, iHeight, this ); 来打开图像的
    而我的程序用DisplayJAI dd = new DisplayJAI(image);和final JScrollPane sp = new JScrollPane(dd);显示图像,要画矩形必须使用protected void paintComponent( Graphics g ){}  (我的理解,说得不对别见怪),而paintComponent( Graphics g ){……}有错,我很郁闷
      

  3.   

    是不是因为用了JScrollPanes所以无法使用paintComponent( Graphics g ){……}?
      

  4.   

    模拟二楼给的程序,既然只能在JPanel上画矩形,就将JPanel添加到JScrollPane中
    修改后的程序如下,但仍然不能成功画出矩形:
    class Paint {
            public Paint(PlanarImage image){
                String path = null;
                JFrame frame = new JFrame();
                DisplayJAI dd = new DisplayJAI(image);
                JScrollPane sp = new JScrollPane(new Canvas(dd));
                frame.add(sp,BorderLayout.CENTER);
                frame.setSize(500,600);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        }    class Canvas extends JPanel{
            int x, y, x1, y1, x2, y2, w, h;
            public Canvas(DisplayJAI dd){
                this.add(dd);
                AmouseListener al = new AmouseListener();
                this.addMouseListener( al );
                this.addMouseMotionListener( al );
            }
            @Override
            protected void paintComponent( Graphics g ) {
                super.paintComponent( g );
                Graphics2D g2 = (Graphics2D)g;
                g2.setColor(Color.RED);
                g2.drawRect(x, y, w, h);
            }        //监听鼠标事件的监听器
            class AmouseListener extends  MouseAdapter{
                @Override
                public void mousePressed( MouseEvent e ) {
                    x1 = (int)e.getPoint().getX();
                    y1 = (int)e.getPoint().getY();
                }            @Override
                public void mouseReleased( MouseEvent e ) {            
                    x2 = (int)e.getPoint().getX();
                    y2 = (int)e.getPoint().getY();
                    x = Math.min( x1, x2 );
                    y = Math.min( y1, y2 );
                    w = Math.abs( x1 - x2 );
                    h = Math.abs( y1 - y2 );
                    Canvas.this.repaint();
                }            @Override
                public void mouseDragged( MouseEvent e ) {
                    x2 = (int)e.getPoint().getX();
                    y2 = (int)e.getPoint().getY();
                    x = Math.min( x1, x2 );
                    y = Math.min( y1, y2 );
                    w = Math.abs( x1 - x2 );
                    h = Math.abs( y1 - y2 );
                    Canvas.this.repaint();
                }
            }
        }