繁体   English   中英

使用ChangeListener触发Java Swing中的更改?

[英]using ChangeListener to fire changes in Java Swing?

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

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

  1. 当用户点击“新游戏” button.so这fireChange中的ActionListener的应该发生ControlPane应该解雇通知New Game按钮。

  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);

    }
 }

在此处输入图片说明

提供侦听器支持“相对”简单。 JComponent将其EventListenerListlistenerList )公开为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM