首先道歉,如果标题很简短,我已经考虑过了,但不能提出足够短的摘要来解答我的问题。
我有一个由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()调用。
非常感谢任何帮助。预先感谢!欢呼声。
答案 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);
}
}
...
}