【问题标题】:Keeping constant track of time in java在java中不断跟踪时间
【发布时间】:2014-02-03 05:46:00
【问题描述】:

所以我想制作一个程序,它可以在代码的其他功能可以运行的同时不断跟踪时间。特别是对于我的代码,我有 4 个 JButton 和 4 个 JLabel。单击 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 Timer
  • 您正在小部件的线程中执行一个长任务,这就是 UI 停止响应的原因,您应该创建一个新线程来执行长作业,或者您可以创建一个新线程,因此它会更新计时器每一秒。

标签: java swing time


【解决方案1】:

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

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

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


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多