【问题标题】:using ChangeListener to fire changes in Java Swing?使用 ChangeListener 触发 Java Swing 中的更改?
【发布时间】:2013-11-22 20:25:20
【问题描述】:

我正在实现一个猜词游戏。所附图片让我了解我在做什么。我的GamePane 由两个组件组成,ControlPaneHangManPane,这是所附图像的顶部和底部。当玩家点击New Game按钮时,必须通知GamePane。随后,GamePane 将向 ControlPane 请求 SecretWord,并将其传递给 HangManPane 以构建模型。

所以这里发生了两件事,我想知道如何实现

  1. 当用户点击“新游戏”按钮时,ControlPane 应该触发通知。所以这个 fireChange 应该发生在 New Game 按钮的 ActionListener 中。

  2. GamePane 监听通知并将信息传递给HangManPane

使用ChangeListener 是合适的。我做了我的搜索,但无法掌握如何在这里实现。欢迎任何建议

public class GamePane extends JPanel {

    public GamePane(){
         ControlPane cp = new ControlPane();
         //if user clicks New Game on ControlPane, notify me
         //I will then do the following 
         HangManModel model = new DefaultHangManModel(cp.getSecretWord());
         HangManPane hangManPane = new HangManPane(model);

         setLayout(new GridLayout(0,1));
         this.add(cp);
         this.add(pane);

    }
 }

【问题讨论】:

标签: java swing actionlistener changelistener


【解决方案1】:

提供监听器支持“相对”简单。 JComponent 将其 EventListenerList (listenerList) 暴露为 protected 变量这一事实简化了它。

ControlPane 中,您需要一个 add 方法...

public void addChangeListener(ChangeListener listener) {
    listenerList.add(ChangeListener.class, listener);
}

你需要一个删除方法

public void removeChangeListener(ChangeListener listener) {
    listenerList.remove(ChangeListener.class, listener);
}

现在,您需要一些方法来根据需要实际引发或触发事件...

protected void fireStateChanged() {
    ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class);
    if (listeners != null && listeners.length > 0) {
        ChangeEvent evt = new ChangeEvent(evt);
        for (ChangeListener listener : listeners) {
            listener.stateChanged(evt);
        }
    }
}

现在,如果您想告诉注册的侦听器 ControlPane 状态已更改,您只需调用 fireStateChanged,例如...

public void actionPerformed(ActionEvent evt) {
    fireStateChanged();
}

现在,在GamePane 中,您需要针对ControlPane 的实例注册ChangeListener...

private ControlPane cp;
private HangManPane hangManPane;

//...

public GamePane() {
    cp = new ControlPane();
    hangManPane = new HangManPane(null);

    cp.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent evt) {
            String secret = cp.getSecretWord();
            DefaultHangManModel model = new DefaultHangManModel(secret);
            hangManPane.setModel(model);
        }
    });
}

例如...

【讨论】:

  • 这里的监听列表是什么?为什么需要ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class);?我想只有一个Listener 我感兴趣,没有一个列表对吗?
  • 现在有办法在游戏结束后从 HangManPane 更改 ControlPane(无论输赢)
  • 1- listenerList 正如我所说,在JComponent 中声明,它是EventListenerList 的一个实例,这是维护一组不同听众列表的好方法,因此2- listenerList.getListeners(ChangeListener.class) 返回之前使用addChangeListener 注册的所有ChangeListeners,你永远不知道将来谁可能想听;)...
  • 3- 我可能会做的是,当GamePanel 创建一个新模型时,向它注册一个HangManListener,这样当游戏输赢时,您会收到通知,那么我将提供一种方法,您可以通过它“启用”/“禁用”ControlPane...
  • 我得到一个编译错误 'ChangeEvent evt = new ChangeEvent(evt);, that is because evt` 变量未声明..如果您不介意,您能逐行说明 fireStateChanged 方法的作用吗?非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多