java - 在java中持续跟踪时间

标签 java swing time

所以我想制作一个程序,在代码的其他功能可以运行的同时不断跟踪时间。具体来说,对于我的代码,我有 4 个 JButton 和 4 个 JLabels。单击 JButton 后,我希望相应的 JLabel 每隔几秒(假设 5 秒)更新一次其文本。但是,在代码运行时,我希望能够在任何给定时间选择不同的按钮来更新其相应的 JLabel 并停止之前的按钮。我尝试了一些方法,但每次都会遇到两个问题:

  1. JLabel 不会每 5 秒更新一次。
  2. 在单击另一个 JButton 时,我无法单击另一个 JButton。

它们都与这样一个事实有关:一旦单击 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);
        }
    }
}

}

最佳答案

您可以使用前面提到的 Swing-Timers 来做到这一点:

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

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

<小时/>

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

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

这完全独立运行,不会阻塞主程序 - 并且可能需要您想要更改的对象的句柄。

关于java - 在java中持续跟踪时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21125873/

相关文章:

java - 使用 Executor 框架在 Weblogic SOAP Webservice 中创建后台线程

java - 多次截图程序

r - R:如何处理没有日期的时间?

c - linux内核启动时间

java - 如何在 java 中使用 JSON 输出

java - JFreeChart - 带日期轴的水平堆叠条形图

java - 方法执行完成后本地字节缓冲区是否被清空?

java - 在 Java 中执行 ActionPerformed 期间更新 JTextFields

java - 使用 GridBagLayout 构建大富翁棋盘

java - 如何在每次点击字符串时更新当前时间和日期