0

首先,如果标题很简短,我深表歉意,我已经考虑过了,但无法为我的问题提供足够简短的摘要。

我有一个由 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() 调用。

任何帮助将非常感激。预先感谢!干杯。

4

1 回答 1

1

您不能将事件重新抛出给父级,因为父级不支持传递ActionEvents。但是在您的情况下,您可以简单地检查您的组件是否具有操作支持并调用它。像这样的东西

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

...
}
于 2014-06-05T15:06:12.973 回答