Java将ActionEvents传递给父组件

时间:2014-06-05 13:14:41

标签: java swing jpanel actionevent dispatchevent

首先道歉,如果标题很简短,我已经考虑过了,但不能提出足够短的摘要来解答我的问题。

我有一个由JButtons组成的JPanel类。

我有我的主要Swing应用程序类,它有Swing组件,与JPanel类一样好。我想要做的是将从我的JPanel类触发的ActionEvents分派到我的Swing应用程序类进行处理。我在网络和论坛(包括这个)上搜索了一些例子,但似乎无法让它发挥作用。

我的JPanel课程:

public class NumericKB extends javax.swing.JPanel implements ActionListener {
    ...

    private void init() {
        ...
        JButton aButton = new JButton();
        aButton.addActionListener(this);

        JPanel aPanel= new JPanel();
        aPanel.add(aButton);
        ...
    }

    ...

    @Override
    public void actionPerformed(ActionEvent e) {   
        Component source = (Component) e.getSource();

        // recursively find the root Component in my main app class
        while (source.getParent() != null) {            
            source = source.getParent();
        }

        // once found, call the dispatch the current event to the root component
        source.dispatchEvent(e);
    }

    ...
}



我的主要应用类:

public class SimplePOS extends javax.swing.JFrame implements ActionListener {


    private void init() {
        getContentPane().add(new NumericKB());
        pack();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        ...

        // this is where I want to receive the ActionEvent fired from my NumericKB class
        // However, nothing happens

    }
}  


想要编写单独的JPanel类的原因是因为我想在其他应用程序中重用它。

另外,实际的代码,我的主应用程序类有许多子组件,并且JPanel类被添加到其中一个子组件中,因此递归.getParent()调用。

非常感谢任何帮助。预先感谢!欢呼声。

1 个答案:

答案 0 :(得分:1)

您无法将事件重新抛出到父级,因为父级不支持传递ActionEvent。但在您的情况下,您只需检查您的组件是否有动作支持并调用它。像这样的东西

public class NumericKB extends javax.swing.JPanel implements ActionListener {
  ...

  private void init() {
    ...
    JButton aButton = new JButton();
    aButton.addActionListener(this);

    JPanel aPanel= new JPanel();
    aPanel.add(aButton);
    ...
  }

  ...

  @Override
  public void actionPerformed(ActionEvent e) {   
    Component source = (Component) e.getSource();

    // recursively find the root Component in my main app class
    while (source.getParent() != null) {            
        source = source.getParent();
    }

    // once found, call the dispatch the current event to the root component
    if (source instanceof ActionListener) {
      ((ActionListener) source).actionPerformed(e);
    }
  }

...
}