2015-10-07 76 views
0

在这个程序中,我们应该点击一个表示“开始”的按钮,然后动画将在屏幕上开始运行。点击“开始”后,该按钮将变为“暂停”按钮,如果您点击该按钮,则会停止动画,并出现“恢复”按钮。我不知道如何将所有这三个操作都放到一个按钮中。这里是我到目前为止的代码:JButton中的多个操作

JButton button = new JButton("Start"); 
     button.addActionListener(new 
     ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       Timer t = new Timer(100, new 
        ActionListener() 
        { 
         public void actionPerformed(ActionEvent event) 
         { 
          shape.translate(x, y); 
          label.repaint(); 
         } 
        }); 
       t.start(); 
      } 
     }); 

我知道这是不对的。当我运行该程序时,动画处于空闲状态,直到我点击“开始”,这是正确的,但每当我再次点击该按钮时,动画加速就不正确。我如何着手为按钮添加不同的操作?

例如,在动画运行后,我希望“暂停”按钮在单击时停止定时器,然后在点击“恢复”时恢复定时器。我现在的代码每次点击它时都会创建一个新的Timer对象,但这似乎是我得到它的唯一方法。如果我在ActionListener之外放置任何东西,我会遇到范围错误。有什么建议么?

回答

1

我知道这是不对的。当我运行该程序时,动画处于空闲状态,直到我点击“开始”,这是正确的,但每当我再次点击该按钮时,动画加速就不正确。

这是因为您每次按下按钮时都会创建多个新的Timer。您应该有一个单一的参考Timer并根据它的当前状态作出决定如何处理

//... 
private Timer timer; 
//... 

JButton button = new JButton("Start"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     if (timer == null) { 
      timer = new Timer(100, new ActionListener() { 
       public void actionPerformed(ActionEvent event) { 
        shape.translate(x, y); 
        label.repaint(); 
       } 
      }); 
      timer.start(); 
      button.setText("Pause"); 
     } else if (timer.isRunning()) { 
      timer.stop(); 
      button.setText("Resume"); 
     } else { 
      timer.start(); 
      button.setText("Pause"); 
     } 
    } 
}); 
+0

非常感谢!这固定了它。我知道我每次创建一个新的Timer都不是我想要的。我从来没有想过把计时器放在我的私人实例变量中。 – GenericUser01

1

但随后每当我再次点击该按钮时,动画加速都不正确。

不要在ActionListener中继续创建Timer。每次点击按钮,你都会启动一个新的定时器。

请在您的类的构造函数中创建Timer。然后在ActionListener你只需start()现有的Timer

Then Pause and'Resume buttons will also just invoke the stop()and restart()`方法也存在于现有的Timer中。

+0

这是一个问题。我试过这样做,但我得到了“不能引用在封闭范围内定义的非局部变量”我可以得到这个工作的唯一方法是将Timer的构造函数放在'ActionListener'中。 – GenericUser01

+0

@ GenericUser01对于示例代码来说,没有足够的上下文来提供完整的解决方案,除了说,尝试使Timer类成为类的实例字段 – MadProgrammer

+1

要做到这一点的方法是重构代码,以便将Timer定义为类中的实例变量。 – camickr