如何使用带JPanel的swing计时器

时间:2015-09-24 04:06:57

标签: java swing timer jframe jcomponent

我非常确定我理解摇摆计时器是如何工作的,我只是无法弄清楚如何在我的代码中应用它。我在代码中应用它的方式并不允许它绘制,因为Graphics g超出了它的范围。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JayFrame extends JFrame
{
  public JayFrame()
  {
    super("My Frame");
    setContentPane(new DrawPane());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(1200, 675);
    setResizable(false);
    setVisible(true);
  }

  class DrawPane extends JPanel
  {
    Timer timer = new Timer(1000, new MyTimer());

    public void paintComponent(Graphics g)
    {
      //Paint stuff
      super.paintComponent(g);

      timer.start();

      for(int i = 0; i < 1000; i += 110)
      {
        g.fillRect(i, 10, 100, 100);

        try{Thread.sleep(100);}
        catch(InterruptedException ie){}
      }

      timer.stop();
    }
  }

  class MyTimer implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      //Loop stuff
      repaint();
    }
  }

  public static void main(String[] args)
  {
    new JayFrame();
  }
}

编辑:我已更新代码以显示我认为应该有效的内容,但却没有。所以我可能对摆动计时器有一个错误的理解。

1 个答案:

答案 0 :(得分:2)

  • 请勿在{{1​​}}方法中调用timer.start();和/或timer.stop(),这无论如何都不会有任何意义,因为各种原因可能会出现绘画,我的你无法控制的。
  • 请勿在{{1​​}}中致电paintComponent,这是Thread.sleep的重点。您只是阻止Swing更新屏幕或处理任何新事件

paintComponent充当psudo循环,在Timer的每次迭代中,您更新某个状态,检查一些退出条件并做出关于应该发生什么的决定。

Timer只描绘当前状态。

例如:

Timer