我如何在没有最终字符串的情况下通过不同的线程更改 JLabel?

How can i make the JLabel change through different threads without a final String?

我知道这似乎是一个被反复询问和回答的问题,但即使在梳理堆栈溢出数小时后我也无法解决问题。如果我遗漏了一些明显的东西,请提前道歉。

我需要在每次线程启动时更改 jLable 的文本,并在该线程结束时再次更改。简单地说,我试图显示当前 运行 的线程数。

jobQueueView 是一个静态的最终 jLabel。 Main 是具有 jLabel 的 jFrame。 jobQueue 是静态整数。

在每个线程的开头:

jobQueue += 1; refreshQueue();

在每个线程的末尾:

jobQueue -= 1;refreshQueue();

最后

public void refreshQueue() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main().jobQueueView.setText(Integer.toString(jobQueue));
            }
        });

    }

这行不通。有任何想法吗?谢谢

编辑:按照 Andrew Thompson 的指示 Swing JLabel text change on the running application : 在按钮点击事件上

Can I change the text of a label from a Thread in Java? :必须使字符串成为最终字符串。我不能。

Update JLabel from another thread:使用定时器,我需要线程数

:尝试了给定的解决方案。没用

Thread and JLabel in Swing- Not working properly : 按钮点击次数较多但解决方案不同。还是没用

所以你的问题是,在匿名内部 类 中只能从外部 类

访问最终变量

所以为了让你的代码工作

   public void refreshQueue(int jobQueue) {
        final int jobQueueCount = jobQueue;
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main().jobQueueView.setText(Integer.toString(jobQueueCount ));
            }
        });

    }

并被

使用
jobQueue += 1; refreshQueue(jobQueue);

jobQueue -= 1; refreshQueue(jobQueue);

希望对您有所帮助。

看来你每次都在创建一个新的框架。

new Main().jobQueueView.setText(Integer.toString(jobQueueCount ));

所以你有多个框架,但有一个静态标签。这可能会导致问题。通过如下静态方式访问 jobQueueView。

Main.jobQueueView.setText(Integer.toString(jobQueueCount ));

给出的两个答案解决了问题。这是最终代码。

public void refreshQueue(int jobQueue) {
        final int jobQueueCount = jobQueue;
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
               Main.jobQueueView.setText(Integer.toString(jobQueueCount ));
            }
        });

    }

在线程的开头

jobQueue += 1; refreshQueue(jobQueue);

最后

jobQueue -= 1; refreshQueue(jobQueue);