在Java中保持对时间的持续跟踪

时间:2014-01-14 23:00:11

标签: java swing time

所以我想创建一个程序,在代码的其他功能可以运行的同时不断跟踪时间。对于我的代码,我有4个JButtons和4个JLabel。一旦我点击一个JButton,我希望相应的JLabel每隔几秒更新一次文本(比方说5秒)。但是当代码运行时,我希望能够在任何给定时间选择一个不同的按钮来更新其相应的JLabel并停止之前的那个。我尝试了一些东西,但每次遇到两个问题:

  1. JLabel不会每5秒更新一次。
  2. 单击另一个JButton时,我无法单击其他JButton。
  3. 它们都与我的代码在点击JButton后经历无限循环这一事实有关,但我不知道如何绕过这样做。

    我是编码的新手,所以我对术语的了解非常有限。任何帮助将不胜感激。

    以下是单击按钮时发生的代码。 (我在这里和那里更改了代码几次尝试自己修复,但目前还不能给我一个stackoverflow错误。):

    package maingame;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    
    import javax.swing.JButton;
    import javax.swing.JLabel;
    
    public class StatButtonListener implements ActionListener
    {
    private JButton _button;
    private ArrayList<JLabel> _jlList;
    private static String _clicked;
    public StatButtonListener(JButton button, ArrayList<JLabel> jlList)
    {
        _button = button;
        _jlList = jlList; 
    }
    
    @Override
    public void actionPerformed(ActionEvent arg0)
    {
        _clicked = _button.getText(); 
        Long value = null;
        JLabel valueLabel = null;
        // to stop an infinite loop
        for(int i=0; i < 8; i++)
        {
            if(_button.getText().equals(_jlList.get(i).getText()))
            {
                valueLabel = _jlList.get(i+1);
                value = Long.parseLong(valueLabel.getText());
            }
        }
        double startTime = System.currentTimeMillis()/1000;
        updateStat(value, valueLabel, startTime);
    
    
    }
    
    public void updateStat(Long value, JLabel valueLabel, double startTime)
    {
    
        if(!(value == null || valueLabel == null))
        {   
            if(_clicked.equals(_button.getText()))
            {
                double endTime=System.currentTimeMillis()/1000;
                if((endTime-startTime) >= 1)
                {
                    startTime = System.currentTimeMillis()/1000;
                    value = value + 3;
                    valueLabel.setText(value.toString());
                }
                updateStat(value, valueLabel, startTime);
            }
        }
    }
    

    }

1 个答案:

答案 0 :(得分:1)

您可以使用前面提到的Swing-Timers来执行此操作:

http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

一旦完成,就会调用actionPerformed()。然后,您可以更新要更新的内容并重新启动()它。


或者您可以使用新的线程执行此操作:

http://de.wikibooks.org/wiki/Java_Standard:_Threads

它完全独立运行,不会阻止主程序 - 并且可能需要处理您想要更改的对象。