2012-04-15 9 views
0

私は関数dodaj()を持っています。 JFrameでは、このJFrameにはJPanelがあります。 JPanelからボタンを使用するには、私はActionListenerを使用しています。しかし、誰かがボタンをクリックすると、関数dodaj()を呼びたいと思います。 JFrameから 私はActionLIstenerをJFrameに持っていればthis.dodaj();を使うことができますが、JPanelにはアクションリスナーがあり、JFrameのコンポジションがあります。 どうすればdodaj()を呼び出すことができますか。 JPanelにActionListenerのJFrame関数(JFrame関数)がありますか?Java - 合成オブジェクトからthis.function()を呼び出す

私の悪い英語を読んでいただきありがとうございます。

+0

まず、通常は 'this.'パーツなしでメソッドを呼び出すことができ、通常は動作します。 –

+0

もし私がエラーが表示されたら: "JPanelでシンボルを見つけることができません" – user1304098

答えて

2

あなたはそれを言及していませんが、あなたのJFrameとJPanelsの両方のクラスですから、別のクラスのあるクラスからメソッドを呼びたいという問題がありますか?その場合、キーはJFrameクラスへの参照を取得し、コンストラクタまたはメソッドのパラメータを使用してJPanelクラスに渡すことです。例えば

:余談として

class MyFrame extends JFrame { 
    private MyPanel myPanel; 

    public MyFrame() { 
     myPanel = new MyPanel(this); 
    } 

    public void frameMethod() { 
     System.out.println("in JFrame's frameMethod"); 
    } 

} 

class MyPanel extends JPanel { 
    private MyFrame myFrame; 
    private JButton someButton = new JButton("Button"); 

    public MyPanel(final MyFrame myFrame) { 
     this.myFrame = myFrame; 

     someButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      myFrame.frameMethod(); 
     } 
     }); 
    } 
} 

、私はそのようなメソッドをオーバーライドする必要があるなど正当な理由なしにJFrameのか、のJPanelを拡張することはお勧めしません。

+0

私の問題を解決してくれてありがとう:) – user1304098

+0

@ user13:どうぞよろしくお願いします。 –

+0

JFrameやJPanelの拡張をお勧めしないのはなぜですか? – user1304098

1

JPanelでは、getParent()を使用して親JFrameコンテナをいつでも参照できます。

JPanelのActionListenerが匿名クラスである場合は、直接getParent()メソッドを使用して直接参照できます。あなたのActionListenerが別のクラスである場合、それをインスタンス化するときに親参照を渡すことができます。

+0

ありがとうございます。 – user1304098

関連する問題