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

我正在实现一个猜词游戏。所附图片让我了解我在做什么。我的GamePane 由两个组件组成,ControlPane 和HangManPane,这是所附图像的顶部和底部。当玩家点击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
相关资源
最近更新 更多