如何在JFrame中以正确的方式实现计时器

时间:2015-04-14 20:26:24

标签: java swing timer draw point

我正在努力找出如何通过计时器让这个程序中的每一秒或两个更改。我尝试了一些组合,但这是不成功的。 我相信ActionListener中有一些东西我可能会失败。

ArrayList<Point> punkter = new ArrayList<Point>();

int i = 0;
int n = 0;
public Point[] point = null;
private Timer timer;
Random rg = new Random();


public timer(){
    this.setTitle("Draw");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(1010, 710);
    this.setLayout(null);
    this.setLocationRelativeTo(null);

    point = new Point[100];

    this.setVisible(true);

    timer = new Timer(500,this);
    timer.start();
}
public void paint(Graphics g){
    super.paint(g);

    for (int i = 0; i < punkter.size(); i++) {
        Point a = punkter.get(i);
        Point b = punkter.get((i+1)%punkter.size());
        g.fillOval(a.x,  a.y, 5, 5);
        g.drawLine(a.x, a.y, b.x, b.y);
    }   
}
@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    for(int i = 0;i < 100;i++){
        point[i] = new Point(rg.nextInt(1000), rg.nextInt(700));
        punkter.add(point[i]);
}
    }
}

1 个答案:

答案 0 :(得分:2)

当您想要重绘时,在组件上调用repaint(),否则可能不会调用paintComponent(或paint)方法。可能没有直接相关但值得给出的建议(并在trashgod的评论中注明):使用添加到JFrame的组件(如JPanel),并在此组件的paintComponent方法中执行所有绘图(如果这样做,应该在这个组件上调用重绘)。