2011-04-17 54 views
1

開關jPanels在Java中我有jFrameMainForm其中包含main()placePanel(panel)和下拉菜單。從下拉菜單中的項目,我打電話placePanel(panel)方法將一個特定面板放在jFrame容器中。這工作正常。從外部類

但是,我不知道如何切換面板,當我點擊一個jPanel類內的按鈕。當我嘗試撥打jFrameMainForm.placePanel(panel)來自任何jPanel這是加載到jFrame的容器,我得到的錯誤:cannot reference non-static content等我也試過Mainform.getContainer().add(panel),但它不工作了。

我不知道如何從另一個班級訪問MainForm的容器,或者如何使用另一個面板的方法切換面板。

感謝

回答

2

如果你想從另一個對象中調用對象的方法,你會需要一個參考的第一個對象,所以你可以調用方法的活動對象本身,而不是對班級(正如你現在正在做的那樣)。解決這個問題的一種方法是將一個對持有JPanel的類的引用傳遞給具有該按鈕的動作偵聽器代碼的類,可能在後者的構造函數中。換句話說,您需要將對當前活動和可視化MainForm對象的引用傳遞給具有該按鈕的ActionListener的類。

順便說一下,你是否交換JPanels與CardLayout?如果沒有,我建議你看看它,因爲它通常是最簡單的方法。

編輯:

例如,假設你有一個類名爲MainForm中,有一個叫swapJPanels公共方法,允許其交換意見,並有你的JButton另一個類MyPanel想要調用從一個方法MainForm類,那麼你可以給MyPanel一個構造函數一個MainForm的參數,並允許您通過從當前的MainForm對象(本類內)的引用,到MyPanel對象:

的MainForm:

class MainForm extends JFrame { 

    public MainForm() { 
     MyPanel myPanel = new MyPanel(this); // pass "this" or the current MainForm reference to MyPanel 
    } 

    public void swapJPanels(int panelNumber) { 

    } 
} 

個MyPanel:

class MyPanel extends JPanel { 
    private MainForm myMainForm; // holds the reference to the current MainForm object 

    public MyPanel(MainForm myMainForm) { 
     this.myMainForm = myMainForm; // set the reference 

     JButton swapPanelBtn = new JButton("Swap Panel"); 
     swapPanelBtn.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      swapPanelBtnActionPerformed(); 
     } 
     }); 
    } 

    private void swapPanelBtnActionPerformed() { 
     myMainForm.swapJPanels(0); // calling a method on the reference to the current MainForm object 
    } 
} 
+0

我不使用cardLayout,我不知道任何事情,這是我第一次聽說這件事。我要去查看它,看看它做了什麼。 另外,你是什麼意思的「通過參考」?我已經嘗試使用:MainForm.getContainer()。add(panel)從jPanel引用jFrame的MainForm?我知道這是錯誤的,但我如何正確「傳遞參考」? – Luka 2011-04-17 14:09:41

+0

@Luka:你可以在這裏找到如何使用它的教程:[如何使用CardLayout](http://download.oracle.com/javase/tutorial/uiswing/layout/card.html),但要明白它不會解決你最初的問題 - 擁有和調用另一個對象內的一個對象的引用方法。 – 2011-04-17 14:11:12

+0

好吧,卡片佈局很有趣,但它是一種解決方法。但是,我做錯了MainForm.getContainer()。add(panel)或MainForm.placePanel(panel)?每當我嘗試從jPanel使用此代碼(在Jframe內部工作)時,它會發生錯誤。我已經有了placePanel方法,我如何從另一個類調用它? – Luka 2011-04-17 14:15:53