我正在使用java线程来更新我的应用程序中的jlabel文本值 但在更新了jlabel上的文字之后 jlabel通过刷新本身定期显示所有过去更新的值和新值
但是当我在jlabel的mouseclick事件中使用相同的更新功能时,它会按照我的预期更新自己并仅显示最后一个值
什么可能导致这个问题 我错过了一些鼠标点击事件内部调用的方法吗?
nore:应用程序是japplet
答案 0 :(得分:3)
不确定究竟发生了什么,但我首先要确保您的更新发生在事件派发线程中。让你的更新程序线程调用:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ...update the text...
}
});
请参阅Event Dispatch Thread教程。
答案 1 :(得分:2)
您必须确保在Event Dispatch Thread上执行对Swing UI组件的任何更改。以下是完成此操作的两个建议:
<强>定时器强>
如果目的是定期刷新JLabel
文字,您可以查看javax.swing.Timer。计时器在事件调度线程上定期触发ActionEvent
:
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
label.setText("foo");
}
};
new Timer(delay, taskPerformer).start();
<强>的SwingWorker 强>
或者,您可以考虑使用SwingWorker来执行后台处理。后台工作线程可以通过调用publish
将信息传递回Event Dispatch线程。
new SwingWorker<Void, String>() {
// Called by the background thread.
public Void doInBackground() {
for (int i=0; i<100; ++i) {
// Do work. Periodically publish String data.
publish("Job Number: " + i);
}
}
// Called on the Event Dispatch Thread.
@Override
protected void process(List<String> chunks) {
// Update label text. May only want to set label to last
// value in chunks (as process can potentially be called
// with multiple String values at once).
for (String text : chunks) {
label.setText(text);
}
}
}.execute();
答案 2 :(得分:1)
为什么不试试这个: 的标签强> .paintImmediately(的标签强> .getVisibleRect());