我正在实现一个猜词游戏。所附图片给出了我在做什么的想法。我的 GamePane
由两个组件组成,ControlPane
和 HangManPane
,它们是所附图像的顶部和底部部分。当玩家点击 New Game
按钮时,必须通知 GamePane
。随后,GamePane
将从 ControlPane
请求 SecretWord,并将其传递给 HangManPane
以构建模型。
所以这里发生了两件事,我想知道如何实现
ControlPane 应该在用户点击“New Game”按钮时触发通知。因此这个 fireChange 应该发生在
New Game
按钮的 ActionListener 中。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);
}
}
最佳答案
提供监听器支持“相对”简单。 JComponent
将它的 EventListenerList
(listenerList
) 作为 protected
变量公开,从而简化了这一过程。
在 ControlPane
中,您需要一个添加方法...
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);
}
});
}
例如……
关于java - 使用 ChangeListener 触发 Java Swing 中的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153868/