只有鼠标单击的JLabel更新JLabel的文本属性的情况下适当
题
我使用的是Java线程在我的应用程序更新的JLabel文本值 但之后更新文本的JLabel JLabel的周期性表示通过刷新本身为了所有过去的更新值和新值
但是当我使用相同的更新功能的JLabel的鼠标点击事件内它被更新本身作为我预期并且仅示出最后一个值
什么可能导致此问题 我失去了一些方法,这些鼠标点击事件内部调用?
诺雷:应用是JApplet的
解决方案
您必须确保任何更改UI组件的事件指派线程进行摆动。下面是用于完成此两个建议:
<强>定时器强>
您可能想看看的javax.swing .Timer 如果目的是定期刷新JLabel
文本。计时器触发ActionEvent
s定期对事件指派线程:
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
label.setText("foo");
}
};
new Timer(delay, taskPerformer).start();
<强>的SwingWorker 强>
另外,你可能要考虑使用的SwingWorker 执行你的后台处理。背景工作线程可以通过调用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();
其他提示
不知道到底发生了什么,但我会通过确保您的更新发生在事件调度线程启动。让你的更新线程调用:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ...update the text...
}
});
请参阅事件指派线程教程。
为什么不ü尝试这样的: 的标签强> .paintImmediately(的标签强> .getVisibleRect());
不隶属于 StackOverflow