gpt4 book ai didi

java - 可以不使用定时器

转载 作者:行者123 更新时间:2023-12-01 21:41:22 25 4
gpt4 key购买 nike

大家好,我想问是否可以不使用 Java netbeans 中的计时器来使用 while 循环在我的 JLabel 上显示变量“计数器”的所有值。这是我的示例代码。

int counter = 0;

while (counter < 10) {
lblDisplay.setText("Completed " + Integer.toString(counter));
try {
Thread.sleep(1000);
lblDisplay.setText("Completed " + Integer.toString(counter));
} catch (InterruptedException ex) {
Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex);
}
counter++;
}

在使用 system.out.println 时它被显示,但在我的标签中却没有显示。

最佳答案

是的,可以避免使用 Swing Timer 来实现此目的,但如果您这样做了:

  • 您必须确保循环和 Thread.sleep(...)在 Swing 事件线程之外的后台线程中运行。如果您不这样做,您将卡住事件线程,从而卡住您的 GUI 并使其变得无用。
  • 然后,您必须确保当您仅从后台线程进行 Swing 调用时,您会尽力将这些调用排队到 Swing 事件调度线程中。如果不这样做,您将面临导致偶尔难以调试的线程错误的风险。

由于涉及额外的工作和出错的风险,您会发现仅使用 Swing Timer 更简单更安全。例如,您发布的代码看起来面临着使整个 GUI/应用程序进入休眠状态的严重风险,因为它同时具有 while 循环和 Thread.sleep(...)调用时不关心线程。

例如,如果没有计时器,您的代码可能看起来像这样(警告:代码未编译或测试):

new Thread(new Runnable() {
public void run() {
int counter = 0;

while (counter < 10) {
lblDisplay.setText("Completed " + Integer.toString(counter));
try {
Thread.sleep(1000);
final int finalCounter = counter;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
lblDisplay.setText("Completed " + finalCounter);
}
});
} catch (InterruptedException ex) {
Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex);
}
counter++;
}
}
}).start();

这比我喜欢的要复杂一点,而 Swing Timer 可能看起来像:

int delay = 1000;
new Timer(delay, new ActionListener() {
private int count = 0;

@Override
public void actionPerformed(ActionEvent e) {
if (count < 10) {
lblDisplay.setText("Completed " + counter);
} else {
((Timer) e.getSource()).stop(); // stop the Timer
}
counter++;
}
}).start();

比以前更简单、更安全。

关于java - 可以不使用定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36393350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com