我为JPanel添加了一个MouseListener监听,当鼠标点击的时候,就在上面画一个圆,现在第一次点击的时候,画完圆就马上消失了,然后再点击就正常了,这是怎么回事?
代码如下:import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JFrame;
import javax.swing.JPanel;public class MouseRe {
public static void main(String[] args){
JFrame frame = new JFrame();
QQ a =new QQ();
frame.add(a);
frame.setBounds(200, 100, 700, 500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}class QQ extends JPanel implements MouseListener{
/**
 * 
 */
private static final long serialVersionUID = 1L;
private int i = 30;
private int j = 30;
public QQ(){
addMouseListener(this);
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
System.out.println("tadfa");
picture(i,j);
i = i + 20;
j = j + 20;
} @Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
} @Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
} @Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
} @Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub }
public void picture(int i,int j){
Graphics g = this.getGraphics();
g.fillOval(i, j, 20,20);
}
}

解决方案 »

  1.   

    没有用 过AWT,你试下在mouseReleased方法里面实现画图,那个mouseclicked,感觉是点击后。。
      

  2.   

    在mousePressed和mouseReleased方法里实现都不行,和在click方法里实现一样
      

  3.   

    如3楼所说,你重载下 paint 方法吧。public void paint(Graphics g) {
       // super.paint(g); // 先注释这句话试试看,然后再放开注释,你就能看到效果了。
    }
      

  4.   

    你要这样做:
    import java.awt.Graphics;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;import javax.swing.JFrame;
    import javax.swing.JPanel;public class MouseRe {
    public static void main(String[] args){
            JFrame frame = new JFrame();
            QQ a =new QQ();
            frame.add(a);
            frame.setBounds(200, 100, 700, 500);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
    }class QQ extends JPanel implements MouseListener{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private int i = 30;
        private int j = 30;
        public QQ(){
            addMouseListener(this);
        }
        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub
            System.out.println("tadfa");
            //picture(i,j);
            repaint();
            i = i + 20;
            j = j + 20;
        }    @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }    @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub    
        }    @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }    @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub    } @Override
    public void paint(Graphics g) {
     g.fillOval(i, j, 20,20);
    }
        
    @Override
    public void repaint() {
    // TODO Auto-generated method stub
    super.repaint();
    }
        
    }
      

  5.   

    这样做第一次还没点击的时候就画了一个圆。必须用paint()方法吗?还有3楼说的最小化后再让窗口恢复正常原先画的图就没了这怎么解决?
      

  6.   

    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JFrame;
    import javax.swing.JPanel;public class MouseRe {
        public static void main(String[] args){
            JFrame frame = new JFrame();
            QQ a =new QQ();
            frame.add(a);
            frame.setBounds(200, 100, 700, 500);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          
        }
        
    }class QQ extends JPanel implements MouseListener{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private int i = 30;
        private int j = 30;
        private List<Point> dots = new ArrayList<Point>();
        
        public QQ(){
            addMouseListener(this);
        }
        @Override
        public void mouseClicked(MouseEvent arg0) {
          
           picture(i,j);
              i = i + 20;
              j = j + 20;
        }
        
        @Override 
        public void paint(Graphics g)
        {
         super.paint(g);
         for(Point p:dots)
         g.fillOval(p.x, p.y, 20, 20);
        }    @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }    @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub    
        }    @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }    @Override
        public void mouseReleased(MouseEvent arg0) {
           // TODO Auto-generated method stub
              }
        public void picture(int i,int j){
        
            dots.add(new Point(i,j));
            repaint();
        }
    }