java - JLabel 的值未使用 Java 中的 setText() 进行更新

标签 java swing jlabel

我知道很多人以前问过这个问题,但我找不到任何答案来解决我的问题。我的代码是这样的:

public void mouseClicked(MouseEvent arg0) {
    TEXT.setText("ON");
    myfunction(); //runs for a very long time
}

JLabel的原文是“OFF”。现在,我想在单击鼠标时将文本更改为“ON”,但直到 myfunction() 完成(这可能需要几分钟)后文本才会设置。

我尝试过 invalidate 函数,创建一个单独的函数来设置文本,但没有任何效果。

请帮我解决这个问题!

最佳答案

问题在于 mouseClicked(...)UI Thread 上执行。那就是Thread它负责处理各种用户操作(例如鼠标单击)以及组件的绘制(例如更新屏幕上标签的文本)。如果您在 UI 线程上执行长时间运行的方法调用,它将被阻塞并且在执行完成之前无法绘制任何内容。您必须使用 multi threading来解决这个问题。

以下可能不是最优雅的解决方案,但如果您是多线程新手,它将完成工作:

public void mouseClicked(MouseEvent arg0) {
    TEXT.setText("ON");
    (new Thread() {
        public void run() {
            myfunction();
        }
    }).start();
}

它将生成一个新的 Thread 来处理您的方法,这将使 UI Thread 继续执行其操作。考虑停用刚刚单击的按钮,这样用户就无法在执行过程中开始执行(这通常是您想要的......)

关于java - JLabel 的值未使用 Java 中的 setText() 进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705513/

相关文章:

java - Java中LinkedList的更新性能

java - docx4j - 从 xml 文件加载部分

java - 如何使用java mvc向数据库插入数据

java - Java Swing 中的拖动 handle

java - 在 Java Swing GUI 中立即输出文本的正确方法

java - JComboBox 与 TableModel 共享数据

java - JFrame setText() 中的 JLabel 问题

java - Swing JProgressBar 下面有多个 JLabels

java框架和标签

java - log4j xml配置,将一些Logger写入文件和控制台