我如何在没有最终字符串的情况下通过不同的线程更改 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);
我知道这似乎是一个被反复询问和回答的问题,但即使在梳理堆栈溢出数小时后我也无法解决问题。如果我遗漏了一些明显的东西,请提前道歉。
我需要在每次线程启动时更改 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);