我写了个用鼠标点击面板,在面板上画点的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
public class Exercise16_23 extends JFrame {
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame = new Exercise16_23();
frame.pack();
frame.setTitle("Exercise16_23");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public Exercise16_23() {
add(new DrawPoint());
}
class DrawPoint extends JPanel {
private ArrayList<Point> list = new ArrayList<Point>();
private int x ;
private int y ;
public DrawPoint() {
setPreferredSize(new Dimension(600,600));
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
repaint();
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
x = (int)(Math.random()*400);
y = (int)(Math.random()*400);
list.add(new Point(x,y));
for(int i=0;i<list.size();i++) {
g.drawOval(list.get(i).x, list.get(i).y, 10, 10);
}
System.out.println(list);
}
}
}
然后我都没点击鼠标,就开始画点了,而且每次点击鼠标,画点的次数也不一样,我想这是因为
paintComponent
这个方法会在显示面板或者调整面板时都会调用,因为这些方法改变了面板的属性。要实现点击鼠标就画出一个圆,我把
x = (int)(Math.random()*400);
y = (int)(Math.random()*400);
list.add(new Point(x,y));
这句话放在鼠标事件里面,也就是repaint()方法的前面,然后就可以了,因为无论面板改变与否,点击鼠标事件都只会在点击鼠标的时候触发。