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

标签 java swing actionlistener changelistener

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

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

  1. ControlPane 应该在用户点击“New Game”按钮时触发通知。因此这个 fireChange 应该发生在 New Game 按钮的 ActionListener 中。

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

    }
 }

enter image description here

最佳答案

提供监听器支持“相对”简单。 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/

相关文章:

java - ejb获取当前正在执行的bean

java - 断言不起作用

java - 添加行不起作用

java - 从 Swing App 中的监听器返回信息

java - PowerMock/Mockito 类型转换模拟对象不起作用

java - 房间数据库不需要新的线程来进行长时间的查询操作

java - 在java中使用带有sql的单选按钮对Jtable行进行排序

java - 从线程捕获 ActionEvents

java - getActionCommand在代码中不起作用(观看教程系列)

java - 内部 HashMap 工作 : How to implement hashCode in java