【发布时间】:2014-02-03 05:46:00
【问题描述】:
所以我想制作一个程序,它可以在代码的其他功能可以运行的同时不断跟踪时间。特别是对于我的代码,我有 4 个 JButton 和 4 个 JLabel。单击 JButton 后,我希望相应的 JLabel 每隔几秒(比如说 5 秒)更新其文本。但是在代码运行时,我希望能够在任何给定时间选择不同的按钮来更新其相应的 JLabel 并停止之前的按钮。我尝试了一些事情,但每次遇到两个问题:
- JLabel 并非每 5 秒更新一次。
- 在单击另一个 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);
}
}
}
}
【问题讨论】:
-
贴出你拥有的代码
-
您正在小部件的线程中执行一个长任务,这就是 UI 停止响应的原因,您应该创建一个新线程来执行长作业,或者您可以创建一个新线程,因此它会更新计时器每一秒。