Как изменить свойство JButton? - PullRequest
0 голосов
/ 02 декабря 2011

Я хочу изменить текст кнопки, когда я нажимаю на нее, но она не отображается в графическом интерфейсе.В Intellje IDE я вижу, что он изменен, но почему не отображается в GUI?Это фрагмент кода:

final WebLabel loading = new WebLabel("Disconnected...",  IconLib.ICON_19X17_THICK_ARROW_RIGHT_LIGHTBLUE.getIcon(), SwingConstants.CENTER);
final WebLabel ipLabel = new WebLabel(host);
final JPanel horizontalMiddlePanel = new JPanel();
final WebButton disconnect = new WebButton("Connect",    IconLib.ICON_16X16_QUESTIONMARK_ON_BLUE_CIRCLE.getIcon());
    disconnect.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (loading.getText().equals("Connected...")) {
                loading.setText("Disconnected...");
                loading.setIcon(IconLib.ICON_19X17_THICK_ARROW_RIGHT_LIGHTBLUE.getIcon());
                disconnect.setText("Connect");

            } else {
                loading.setText("test");
                loading.setIcon(IconLib.ICON_19X17_THICK_ARROW_RIGHT.getIcon());
                ipLabel.setText(ipLabel.getText().replace(" Unreachable try again",""));
                ipLabel.setForeground(Color.green);
                disconnect.setText("Connecting");
                callflexConnection(ipLabel, 3001, loading, disconnect);
            }
        }
    });

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

, чем невозможно без разделения кода на две части

1) обновление JButton#setText

затем

2) выполнение оставшейся части кода

  • с помощью javax.swing.Timer
  • выполнить с SwingWorker
  • упаковка внутри Runnble#Thread,

3) этот код выполняется в EDT, затем все изменения выполняются в EDT, заканчиваются в один и тот же / один момент

0 голосов
/ 02 декабря 2011

Трудно сказать, является ли это источником вашей текущей проблемы или нет, но выполнение логики в коде, основанном на текущем тексте на кнопке, является хрупким способом сделать что-то.Вы должны поддерживать это состояние соединения в выделенной переменной.Примерно так:

private enum ConnState {
    CONN_DISCONNECTED,
    CONN_CONNECTING,
    CONN_CONNECTED,
};

private ConnState connState;

private void setConnState(ConnState connState) {
    this.connState = connState;
    switch (connState) {
    case CONN_DISCONNECTED:
        loading.setText("Disconnected");
        disconnect.setText("Connect");
        break;
    case CONN_CONNECTING:
        loading.setText(...etc...);
        disconnect.setText(...);
        break;
    case CONN_CONNECTED:
        loading.setText(...);
        disconnect.setText(...);
        break;
    }
}

И вызовите это при настройке графического интерфейса для инициализации текста кнопки и connState:

setConnState(CONN_DISCONNECTED);

Тогда вы можете здраво рассуждать о текущем состояниипрограмма, проверяя переменную connState вместо необходимости синхронизировать строки кнопок везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...