所以我想创建一个程序,在代码的其他功能可以运行的同时不断跟踪时间。对于我的代码,我有4个JButtons和4个JLabel。一旦我点击一个JButton,我希望相应的JLabel每隔几秒更新一次文本(比方说5秒)。但是当代码运行时,我希望能够在任何给定时间选择一个不同的按钮来更新其相应的JLabel并停止之前的那个。我尝试了一些东西,但每次遇到两个问题:
它们都与我的代码在点击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);
}
}
}
}
答案 0 :(得分:1)
您可以使用前面提到的Swing-Timers来执行此操作:
http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html
一旦完成,就会调用actionPerformed()。然后,您可以更新要更新的内容并重新启动()它。
或者您可以使用新的线程执行此操作:
http://de.wikibooks.org/wiki/Java_Standard:_Threads
它完全独立运行,不会阻止主程序 - 并且可能需要处理您想要更改的对象。