![](/img/trans.png)
[英]trying to understand the output of this swing program that uses changeListener in Java?
[英]using ChangeListener to fire changes in Java Swing?
我正在实施猜词游戏。 所附图像给出了我在做什么的想法。 我的GamePane
由两个组件组成, ControlPane
和HangManPane
,它们是附件图像的顶部和底部。 当玩家单击“ New Game
按钮时,必须通知GamePane
。 随后, GamePane
将向ControlPane
请求SecretWord,并将其传递给HangManPane
以构建模型。
所以这里发生两件事,我想知道如何实现
当用户点击“新游戏” button.so这fireChange中的ActionListener的应该发生ControlPane应该解雇通知New Game
按钮。
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
,您需要一个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);
}
});
}
例如...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.