Проблема с обновлением цвета фона JButton - PullRequest
0 голосов
/ 01 февраля 2019

Мне нужно поддерживать очень старое и плохо написанное программное обеспечение Java.И после обновления я столкнулся с проблемой: есть несколько кнопок, которые изменяют показанную панель в макете карты.Есть зарегистрированные обработчики, и эта часть, кажется, работает.Теперь вторая часть этих кнопок меняет цвет фона.Но это изменение не вызвано щелчком мыши.По крайней мере, не напрямую.Нажатие кнопки вызывает сообщение на некотором компьютере, после чего этот компьютер отвечает статусом, и этот статус приводит к изменению цвета этой кнопки.

Это изменение цвета перестало работать после последнего обновления.Таким образом, в основном есть 2 вопроса:

  1. У меня есть смутное представление о том, что это отсутствие изменения цвета связано с тем, что «не обновляйте элементы GUI вне потока отправки событий».Насколько вероятно, что это корень проблемы?Есть предположение, которое приводит к такому предположению: перемещение мыши вызывает изменение цвета через некоторое время.

  2. Если да, какой самый простой способ справиться с этим?Реализовать PropertyChangeListener на этих кнопках?Или каким-либо другим (лучшим) способом?

Так как хорошие люди здесь настаивают на том, чтобы увидеть какой-то код:

Color[] backgroundColors = {
    ColorExt.btnCol,                // 0 0 not prepare mode, not selected
    ColorExt.darkGreen,             // 0 1 not prepare mode, selected
    ColorExt.YELLOW,                // 1 0 prepare mode, not selected
    ColorExt.dimOrange,             // 1 1 prepare mode, selected
};
JButton[] btn = { mainframe.jBtnLoader1, mainframe.jBtnLoader2, mainframe.jBtnLoader3 };
for (int ldr=0; ldr<3; ldr++) {
    int colorIdx = 0;
    if ((inCellViewFromLoader[ldr][124] & 16) != 0) 
        colorIdx = 2;                   // bLoaderError = true => prepare
    if (mainframe.currentSelectedLoader == ldr) { 
        colorIdx += 1;                  // selected
    }
    btn[ldr].setBackground(backgroundColors[colorIdx]);
}

Хотя в этом нет ничего особенного.Этот код сам по себе не является проблемой.Я предполагаю, что, поскольку этот код выполняется в некотором сетевом потоке, а не в потоке диспетчеризации событий, , что является корнем проблемы.

1 Ответ

0 голосов
/ 01 февраля 2019

Итак, согласно предложению MadProgrammers, я создал небольшой служебный класс:

/**
 * Class to be instantiated in a call to EventQueue.invokeLater(), so the
 * background color of the given component is updated in the Event
 * Dispatch Thread.
 * 
 *
 */
public class ColorChanger implements java.lang.Runnable {

private Color color = Color.WHITE;
private JComponent component = null;

public ColorChanger(JComponent component, Color color) {
    super();
    this.component = component;
    this.color = color;
}

@Override
public void run() {
    if (component != null) {
        component.setBackground(color);
    }
}

}

И затем изменил строку btn [ldr] .setBackground (backgroundColors [colorIdx]);to: EventQueue.invokeLater (новый ColorChanger (btn [ldr], backgroundColors [colorIdx]));

По крайней мере, это выглядит разумным.Это займет некоторое время, пока я не смогу проверить это на сайте клиентов.

...