Я пытаюсь обновить ImageIcon на JLabel, который находится на JLayeredPane, но существует большая задержка между тем, когда поток установки отправляет правильное состояние объекту 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 байтов, так что может быть причиной задержки?Я посмотрел на ветку диспетчера событий, и многие люди говорят, что изображение должно быть мгновенным, чтобы его нарисовали.
Конечная цель: отображать на экране множество объектов-кнопок с потоком настроек, который вызывает их для обновления на основе случайных действий.Отображаемый значок для определенного объекта кнопки должен немедленно измениться, как это установлено в функции.Поток настроек не будет постоянно зацикливаться, вместо этого зацикливайтесь один раз для каждого отправленного действия (здесь дважды, чтобы показать проблему).
Любые предложения или вещи, которые можно попробовать, я протестирую, как только смогу.
Редактировать: В конце поток, который получает информацию, будет вызывать драйвер устройства в Linux, где он будет ждатьдля ответа и только когда он получит ответ, он должен будет обновить окно.Насколько я знаю, таймер используется для обновления чего-либо через равные промежутки времени, но я, вероятно, ошибаюсь.