【问题标题】:Why my JLabel don't updating properly in loop?为什么我的 JLabel 不能在循环中正确更新?
【发布时间】:2019-12-24 23:04:15
【问题描述】:

我想为我的应用程序制作一个加载屏幕,但显示加载量的 JLabel 没有正确更新。

我创建了一个 JDialog 和 JLabel。我想通过线程更新 JLabel 文本。

JDialog loadingScreen = new JDialog((JFrame) null);
JLabel loaded = new JLabel();
loadingScreen.add(loaded);
loading.add(time);
loading.setSize(new Dimension(200,100));

Thread t = new Thread(() -> {
    loading.setVisible(true);
    while (true) {
        if (i3 < Math.pow(characters.size(), Integer.parseInt(length.getText()))) {
            time.setText(i3 + " / " + Math.pow(characters.size(), Integer.parseInt(length.getText()))); //doesn't work
            System.out.println("hi"); //works
        } else break;
    }
});
...
t.start();

【问题讨论】:

标签: java multithreading swing awt jlabel


【解决方案1】:

不要通过线程更新 Swing 组件。而是使用SwingUtilities.invokeLater,如下所示:

JDialog loadingScreen = new JDialog((JFrame) null);
JLabel loaded = new JLabel();
loadingScreen.add(loaded);
loading.add(time);
loading.setSize(new Dimension(200,100));

Thread t = new Thread(() -> {
    loading.setVisible(true);
    while (i3 < Math.pow(characters.size(), Integer.parseInt(length.getText()))) {
        SwingUtilities.invokeLater(() -> time.setText(i3 + " / " + 
            Math.pow(characters.size(), Integer.parseInt(length.getText()))));
        System.out.println("hi");
    }
});
...
t.start();

当然,为 Runnable lambda 使用正确的语法 - 如果它是多行的,则必须使用块。但是,使用线程更新 Swing GUI 组件是not recommended。通常,Swing Timers 是一个更好的主意。

【讨论】:

  • 警告:我假设您处理值的逻辑是正确的 - 我觉得您会在循环中解析 length.getText() 看起来很奇怪,但它可能会自动更新?
  • 谢谢,我用定时器更改了线程,我的代码现在可以工作了。并且没有理由解析length.getText()。我不小心做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多