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

时间:2013-11-22 20:25:20

标签: java swing actionlistener changelistener

我正在实施猜词游戏。附图提供了我正在做的事情的想法。我的GamePane包含两个组件,ControlPaneHangManPane,它们是附加图像的顶部和底部。当玩家点击New Game按钮时,必须通知GamePane。随后,GamePane将从ControlPane请求SecretWord并将其传递给HangManPane以构建模型。

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

  1. 当用户点击“新游戏”按钮时,ControlPane会触发通知。因此,fireChange应该在New Game按钮的ActionListener中发生。

  2. GamePane收听通知并将信息传递给HangManPane

  3. 使用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);
    
        }
     }
    

    enter image description here

1 个答案:

答案 0 :(得分:3)

提供听众支持“相对”简单。 JComponentEventListenerListlistenerList)公开为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);
        }
    });
}

例如......