我正在使用 java 线程更新我的应用程序中的 jlabel 文本值,但是在它更新 jlabel jlabel 上的文本之后,通过刷新本身定期显示所有过去更新的值和新值
但是当我在 jlabel 的 mouseclick 事件中使用相同的更新函数时,它会按照我的预期更新自身并仅显示最后一个值
什么会导致这个问题我错过了mouseclick事件内部调用的一些方法?
nore:应用程序是 japplet
不确定到底发生了什么,但我会首先确保您的更新发生在事件调度线程中。让您的更新程序线程调用:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ...update the text...
}
});
请参阅事件调度线程教程。
您必须确保对 Swing UI 组件的任何更改都在事件调度线程上执行。以下是实现此目的的两个建议:
定时器
如果目的是定期刷新文本,您可能需要检查javax.swing.Timer 。JLabel
计时器ActionEvent
在 Event Dispatch Thread 上定期触发 s:
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
label.setText("foo");
}
};
new Timer(delay, taskPerformer).start();
摇摆工人
或者,您可能需要考虑使用SwingWorker来执行后台处理。后台工作线程可以通过调用将信息传回 Event Dispatch 线程publish
。
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();
你为什么不试试这个: labelname .paintImmediately( labelname .getVisibleRect());