每当我的计数器达到4时,我希望它发出哔哔声并返回“1”并再次计数4次播放哔声等等。
我可能不应该把它放在标签上,因为计数器根本不运行! 标签上写道,我没有任何错误;计数器是4并且不计数或任何东西。
你能帮我把这个计数器正常工作吗?我也用过printline 也犯了一些错误。
我的柜台代码是:
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
label1.setVisible(true);
int counter = 1;
while(counter < 5 )
{
label1.setText("counter is " + counter);
counter = counter + 1 ;
}
counter = 1;
tk.beep();
}
});
答案 0 :(得分:5)
生成一个新线程来计算,等待和更新GUI。
您正在Event Dispatch Thread中完成所有这些工作,这是唯一更新GUI的线程。因此,当您设置标签的文本时,它不会在屏幕上更新,直到方法返回并且事件调度线程处理重绘操作。
您需要生成一个新线程才能执行此操作,而不是仅在立即执行的循环中运行它。只需让actionPerformed
方法生成一个新的Thread
来代替它。在此线程中循环,计数和更新,在更新之间等待Thread.sleep
。要更新标签文本,请创建一个新的Runnable
,它将标签更新为下一个值,并将其放在带有SwingUtilities.invokeLater
的事件调度线程上。保持此线程在后台运行,直到您需要它为止。我建议每次循环检查关闭状态boolean,并在设置为false时退出。这样,您可以随时干净地关闭线程。或者,如果你想让它倒计时并且只发出一次哔哔声,那么你可以在一次迭代计数之后让线程结束。
Stack Overflow上有很多关于每个步骤的问题,所以我不会在这里重复这些信息。
答案 1 :(得分:1)
更改值后需要重新绘制。此外,我假设您实际上想要计算秒数,在这种情况下您需要使用Timer来启动更改标签和可能播放声音的操作。
答案 2 :(得分:1)
也许这就是你所设想的,每按一下按钮就会重置并发出哔哔声
loginButton.addActionListener(new java.awt.event.ActionListener() {
int counter = 1;
public void actionPerformed(ActionEvent arg0) {
label1.setVisible(true);
if (counter < 5) {
label1.setText("counter is " + counter);
label1.repaint();
++counter;
} else {
counter = 1;
tk.beep();
}
}
});
答案 3 :(得分:1)
如果我理解你想要的是什么,下面的代码应该可以实现你的目标。
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
label1.setVisible(true);
Runnable runnable = new Runnable() {
int counter =1 ;
public void run() {
while(true) {
while (counter<5) {
SwingUtilties.invokeLater(new Runnable() {
public void run() {
label1.setText("counter is " + counter);
}
});
counter = counter + 1 ;
try {
Thread.sleep(1000);
}catch(InterruptedException ex) {
System.err.println(ex.toString());
}
}
counter = 1;
tk.beep();
}
}
};
new Thread(runnable).start();
});
答案 4 :(得分:0)
你的循环在前4个循环后停止,从未再次调用。由于文本正在变为快速,因此您只能看到最后的结果
int counter = 0;
while (//when do you want it to stop?)
{
// print what you want (using (counter % 4) + 1)
if ((counter % 4) == 0)
{
tk.beep();
}
}