Java awt swing,带定时器的启动/停止按钮

时间:2018-04-10 00:14:43

标签: java swing timer

我有一个简单的应用程序,可以在执行操作时更改标签的颜色。

当我单击应用程序的按钮(正在执行的操作)时,标签文本的颜色将在计时器设置的间隔内持续变化。

现在,我想要完成的是让我的按钮具有启动和停止标签文本颜色变化的功能。

我能够开始,但我认为在尝试停止执行颜色变化时,我的逻辑存在缺陷。

public void actionPerformed(ActionEvent e) 
    {   
        Timer timer = new Timer(500, timerListener);
        while(!timer.isRunning())
        {
            if(!timer.isRunning())
            {
                button.setText("Stop");
                timer.start();
            }
            else
            {
                timer.stop();
                button.setText("Start");
            }
}

没有" else"之后的内容我能够启动该程序,但不能阻止它。

请查看并提供帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

嗯,每次调用方法时,上面的代码都会创建一个新的计时器。因此,对旧计时器的引用将丢失,这就是调用stop()无效的原因。

(很抱歉也将此作为评论发布,但在我输入后我意识到这可能是整个答案,而不只是关于编程风格的说明。所以我将其添加为答案。)

为了比较,这是我的一些工作代码,它做了类似的事情。注意我只会在我要开始新的计时事件的情况下创建一个新的计时器。停止案例只是停止现有的计时器,它永远不会创建一个。

  @Override
  public void actionPerformed( ActionEvent e )
  {
     if( timing ) {
        timing = false;
        timer.stop();
        view.setStartButtonText( "start stting" );
        view.setTimerLabel( "stopped" );
        view.setBackground( Color.CYAN.darker() );
     } else {
        nanoTime = System.nanoTime();
        view.setStartButtonText( "stop stting" );
        timing = true;
        timer = new javax.swing.Timer( 1000,
                new ActionListener()
                {
                   @Override
                   public void actionPerformed( ActionEvent e )
                   {
                      long minuteTime = ( System.nanoTime() -
                      nanoTime ) /
                      ( 60_000_000_000L );
                      view.setTimerLabel( minuteTime + " minutes" );
                      if( minuteTime > 50 )
                         if( darkBg ) {
                            view.setBackground( Color.PINK );
                            darkBg = false;
                         } else {
                            view.setBackground( Color.PINK.
                                    darker() );
                            darkBg = true;
                         }
                   }
                } );
        timer.setRepeats( true );
        timer.start();
     }
  }