我正在尝试更新位于 JLayeredPane 上的 JLabel 上的 ImageIcon,但是在设置线程将正确状态发送到 JLabel 对象和 GUI 显示正确状态的 ImageIcon 之间存在很多延迟。以下代码是该问题的示例,请查看按钮的打印打开/关闭与显示的图标变亮/变暗之间的时间差异。设置线程:
new Thread(new Runnable() { // setting thread
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true) {
System.out.println("testButton on"); // print that the button is on
testButton.updateState(1); // set button state to on
Thread.sleep(70 + random.nextInt(500)); //sleep between 70 and 570 milliseconds
System.out.println("testButton off");// print that the button is off
testButton.updateState(0); // set button state to off
Thread.sleep(70 + random.nextInt(500)); // sleep between 70 and 570 milliseconds
}
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
按钮对象:
class Button extends JLabel {
ImageIcon released;
ImageIcon pressed;
String text;
public Button(int x, int y, String text) {
released = new ImageIcon("src/components/images/button.png");
pressed = new ImageIcon("src/components/images/buttonDown.png");
setBounds(x,y, 100, 100);
this.text = text;
setIcon(released);
}
public void updateState(int data) {
if (data == 1) {
setIcon(pressed);
}
else {
setIcon(released);
}
}
}
ImageIcons 只有 325 字节,那么可能导致延迟的原因是什么?我查阅了 Event Dispatcher Thread,许多人说绘制图像应该是即时的。
最终目标:屏幕上有许多按钮对象,设置线程根据随机发生的动作调用它们进行更新。特定按钮对象的显示图标应立即更改,因为它在函数中设置。设置线程不会一直循环,而是为每个发送的动作循环一次(这里是两次只是为了显示问题)。
任何建议或尝试的事情我都会尽快测试。
编辑:最后,获取信息的线程将调用 Linux 中的设备驱动程序,在那里它将等待响应,只有当它得到响应时才需要更新窗口。据我所知,计时器用于定期更新某些内容,但我可能错了。
皈依舞
相关分类