2012-04-15 53 views
0

我有函數dodaj();在JFrame中,在這個JFrame中我有JPanel。 要使用來自JPanel的按鈕,我使用ActionListener。但是當有人點擊按鈕時,我想調用函數dodaj();來自JFrame。 如果我在JFrame中有ActionLIstener,我可以使用this.dodaj();但是我在JPanel上有動作偵聽器,其組成爲JFrame。 我怎麼能叫dodaj(); (JFrame函數)從ActionListener與JPanel?Java - 從組合對象調用this.function()

感謝您的閱讀並抱歉我的英文不好。

+0

首先,您通常可以簡單地調用沒有'this.'部分的方法,通常它會起作用。 – 2012-04-15 20:14:58

+0

如果我這樣做,我看到錯誤:「在JPanel中找不到符號」 – user1304098 2012-04-15 20:16:22

回答

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 2012-04-15 20:34:59

+0

@ user13:不客氣。 – 2012-04-15 20:36:01

+0

爲什麼你不推薦擴展JFrame或JPanel? – user1304098 2012-04-15 20:36:25

1

在您的JPanel中,您始終可以使用getParent()引用您的父級JFrame容器。

如果JPanel上的ActionListener是匿名類,則可以直接使用getParent()方法直接引用它。如果你的ActionListener是一個單獨的類,你可以在實例化時將父引用傳遞給它。

+0

非常感謝。 – user1304098 2012-04-15 20:36:54