1

标题有点模棱两可,我会用代码解释。假设我有

Class A extends JFrame implements ActionListener{
     B b;
     Class B extends JPanel{
         public JButton button;
         public B(A a){
               button = new JButton();
               button.addActionListener(a);// I want to process all actionEvents in A
               this.add(button);
         }
     }
     public A(){
         b = new B(this);
         //irrelevant codes omitted for brevity  
     }

     public void actionPerformed(ActionEvent e){
         //Here's the question: 
         //Suppose I have a lot of Bs in A, 
         //how can I determine which B the button 
         //that triggers this callback belongs to?
     }
}

那么有什么办法吗?还是我的想法错了?欢迎任何想法。

编辑:我最后要做的是向 B 添加一个函数has(JComponent component),以与每个可点击的 B 进行比较。当您拥有多层 JPanel 时,这getParent()会变得很尴尬,因为很难弄清楚它指的是哪一层面板,而且这与封装的想法背道而驰。

4

2 回答 2

4

用于e.getSource()获取对触发事件的确切组件的引用。在您的情况下,它将是一个JButton. 要获取它所在的面板,请使用e.getSource().getParent().

于 2013-01-26T20:34:14.913 回答
1

说你有B[] bs = new B[n];

然后您可以action command为每个按钮设置,例如:

for (B b : bs) {
    b.setActionCommand("some identifiable command");    // use different command for different buttons
}

然后在actionPerformed方法中,打开命令:

public void actionPerformed (ActionEvent e) {
    switch (e.getActionCommand()) {
        case "cmd1":
            // do something
            break;
        case "cmd2":
            // do something
            break;
        default:
    }
}

您还可以使用Action对象,它更灵活但更复杂一些。有关更多信息,请阅读 Java 教程:

于 2013-01-26T21:05:35.120 回答