我正在实施猜词游戏。附图提供了我正在做的事情的想法。我的GamePane
包含两个组件,ControlPane
和HangManPane
,它们是附加图像的顶部和底部。当玩家点击New Game
按钮时,必须通知GamePane
。随后,GamePane
将从ControlPane
请求SecretWord并将其传递给HangManPane
以构建模型。
所以这里发生了两件事,我想知道如何实施
当用户点击“新游戏”按钮时,ControlPane会触发通知。因此,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);
}
}
答案 0 :(得分:3)
提供听众支持“相对”简单。 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
中,您需要针对ChangeListener
的实例注册ControlPane
...
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);
}
});
}
例如......