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

Java 如何在没有最终字符串的情况下通过不同的线程更改JLabel?,java,multithreading,swing,jlabel,Java,Multithreading,Swing,Jlabel,我知道这似乎是一个反复询问和回答的问题,但即使在对堆栈溢出进行了几个小时的梳理之后,我仍然无法解决这个问题。如果我遗漏了一些明显的东西,请提前道歉 我需要在每次线程启动时更改jLable的文本,并在该线程结束时再次更改。简单地说,我试图显示当前正在运行的线程数 jobQueueView是一个静态且最终的jLabelMain是带有jLabel的jFramejobQueue是一个静态int 在每个线程的开头: jobQueue += 1; refreshQueue(); jobQueue -= 1

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

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

jobQueueView
是一个静态且最终的jLabel
Main
是带有jLabel的jFrame
jobQueue
是一个静态int

在每个线程的开头:

jobQueue += 1; refreshQueue();
jobQueue -= 1;refreshQueue();
在每个线程的末尾:

jobQueue += 1; refreshQueue();
jobQueue -= 1;refreshQueue();
最后

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

    }
这不管用。有什么想法吗?谢谢

编辑:按照安德鲁·汤普森的指示 :在按钮单击事件上

:必须使字符串成为最终字符串。我不能

:使用计时器,我需要线程计数

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


:更多按钮点击,但解决方案不同。仍然不起作用

所以您的问题是,在匿名内部类中只能从外部类访问最终变量

所以为了让你的代码正常工作

   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);


希望这能有所帮助。

所以您的问题是,在匿名内部类中,只有最终变量可以从外部类访问

所以为了让你的代码正常工作

   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);


希望这能有所帮助。

看起来您每次都在创建一个新的帧

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

因此,您有多个帧,但只有一个静态标签。这可能会导致问题。通过如下静态方式访问jobQueueView

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


看起来你每次都在创造一个新的画面

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);

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

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);

:在按钮单击事件上:必须使字符串为最终值。我不能使用计时器,我需要线程计数@Andrew Thompson这些是我现在打开的,但我尝试了more@AndrewThompson五分之五。谢谢你的帮助“五分之五”。好问题。。对不起,我不知道答案,但希望现在能得到信息。包括,它可以为能够回答问题的人提供他们需要的上下文:在按钮单击事件中:必须使字符串为最终值。我不能使用计时器,我需要线程计数@Andrew Thompson这些是我现在打开的,但我尝试了more@AndrewThompson五分之五。谢谢你的帮助“五分之五”。好问题。。对不起,我不知道答案,但希望现在能得到信息。,它可以为能够回答问题的人提供所需的上下文。如果问题如您所说的“代码未编译”为真,则不能在匿名内部类中使用外部类的非最终成员。如果问题如您所说的“代码未编译”为真,您不能在匿名内部类中使用外部类的非最终成员。根据OP“jobQueueView是一个静态和最终的jLabel”,因此它创建的主类的实例数
jobQueueView
仍将相同,并将正确更新。我同意它应该以静态方式使用,尽管单个标签只能添加到单个父容器中。这可能会导致更新问题。只有在OP发布完整代码时,才能澄清这一问题。可能有一个init方法是从构造函数中单独调用的,而jlabel只添加了一次。@mfidan这是有效的,结合sanjeev下面的回答:D谢谢。问题是我一次又一次地试图给同一位家长添加相同的标签,我想就像你说的那样。谢谢大家。我会将完整的代码作为单独的答案发布。根据OP“jobQueueView是一个静态和最终的jLabel”,因此它正在创建的主视图
jobQueueView
的实例数量仍然相同,并将正确更新。我同意它应该以静态方式使用,尽管单个标签只能添加到单个父容器中。这可能会导致更新问题。只有在OP发布完整代码时,才能澄清这一问题。可能有一个init方法是从构造函数中单独调用的,而jlabel只添加了一次。@mfidan这是有效的,结合sanjeev下面的回答:D谢谢。问题是我一次又一次地试图给同一位家长添加相同的标签,我想就像你说的那样。谢谢大家。我会将完整的代码作为单独的答案发布。