java - 为什么我的 JLabel 不能在循环中正确更新?

标签 java multithreading swing awt jlabel

我想为我的应用程序制作一个加载屏幕,但显示加载量的 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();

最佳答案

不要通过线程更新 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 使用正确的语法 - 如果它是多行,则必须使用 block 。然而,使用线程来更新 Swing GUI 组件是not recommended 。通常,Swing Timers是一个更好的主意。

关于java - 为什么我的 JLabel 不能在循环中正确更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561617/

相关文章:

java - 屏幕关闭时线程偶尔运行

c++ - 如何确保已读取所有管道缓冲区?

Java Action 监听器不工作

Java 从离散类和接口(interface)子类化?

java - 您能为 Java Web 应用程序编码推荐一个标准的、很酷的环境吗?

java - 保护服务层、Web 服务层或两者的 Spring 安全性?

android - 如何在 android 中重新创建 Activity 时销毁旧线程?

java - 固件文件容器 : collection of binary data parts

java - 使用方法 drawString(..) 使用 Arial 字体绘制日文字符 (Graphics2D)

java - 当输入或从 JFileChooser 中选择带有整数的文件时,我需要弹出 Jlist