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?
     }
}

それで、それにする方法はありますか?または私の考えは間違っていますか?どんな考えでも大歓迎です。

編集:私が最終的に行うことは、has(JComponent component)クリック可能なすべてのBと比較する関数をBに追加することです。getParent()JPanelが複数のレイヤーを持っていると、それが参照しているパネルのレイヤーを特定するのが難しく、カプセル化の考え方に反するため、が厄介になります。

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 に答える