【发布时间】:2019-10-23 15:59:27
【问题描述】:
我需要创建一个 GUI 来显示来自串行端口的实时数据。我正在从一个单独的线程读取串行端口数据,我需要从那里更新 GUI。我目前的实现是这样的。
class Gui extends JFrame {
private JLabel lbl = new JLabel();
....
void updateLabel(String text) {
lbl.setText(text);
}
}
class CommPortReceiver extends Thread {
private Gui gui = new Gui();
void run() {
gui.setVisible(true);
....
while (true) {
if (dataAvailable) {
....
gui.updateLabel(data);
sleep(10);
}
}
}
}
我每秒接收大约 10 个值,我希望 Swing 可以处理。我的问题是 JLabel 没有实时更新,它会丢失一些数据,因为它显示的是最新的。我该如何解决这个问题?
【问题讨论】:
-
所有对 Swing 组件的更新都应该在 UI 线程上完成。这对于保持 GUI 一致并且不让它绘制任何仅更改一半的内容是必要的。
-
尝试在 updateLabel 中调用 lbl.repaint 来修复“丢失一些数据”的问题。加上使用 SwingUtilities.updateLater(...) 进行更新应该使所有更新可见
-
@ControlAltDel 我试过这个
EventQueue.invokeLater(new Runnable() { @Override public void run() { gui.updateLabel(data); } });但结果更糟
标签: java multithreading swing user-interface real-time-updates