如何更改JButton属性?

时间:2011-12-02 13:29:19

标签: java multithreading swing user-interface

我想在点击它时更改按钮文本,但它不会出现在GUI上。在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 个答案:

答案 0 :(得分:2)

比没有将代码拆分为两部分而不可能

1)更新JButton#setText

然后

2)执行其余代码

  • 使用javax.swing.Timer
  • delaing
  • SwingWorker执行
  • 包裹在Runnble#Thread内,

3)此代码在EDT上执行,然后所有更改都在EDT上完成,以相同/一个时刻结束

答案 1 :(得分:0)

很难判断它是否是您当前问题的根源,但是根据按钮上的当前文本在代码中执行逻辑是一种脆弱的做事方式。您应该在专用变量中维护该连接状态。像这样:

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;
    }
}

在设置GUI以初始化按钮文本和connState

时调用此方法
setConnState(CONN_DISCONNECTED);

然后,您可以通过检查connState变量而不必在任何地方同步按钮字符串来强有力地推断程序的当前状态。