如果你想從另一個對象中調用對象的方法,你會需要一個參考的第一個對象,所以你可以調用方法的活動對象本身,而不是對班級(正如你現在正在做的那樣)。解決這個問題的一種方法是將一個對持有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
}
}
我不使用cardLayout,我不知道任何事情,這是我第一次聽說這件事。我要去查看它,看看它做了什麼。 另外,你是什麼意思的「通過參考」?我已經嘗試使用:MainForm.getContainer()。add(panel)從jPanel引用jFrame的MainForm?我知道這是錯誤的,但我如何正確「傳遞參考」? – Luka 2011-04-17 14:09:41
@Luka:你可以在這裏找到如何使用它的教程:[如何使用CardLayout](http://download.oracle.com/javase/tutorial/uiswing/layout/card.html),但要明白它不會解決你最初的問題 - 擁有和調用另一個對象內的一個對象的引用方法。 – 2011-04-17 14:11:12
好吧,卡片佈局很有趣,但它是一種解決方法。但是,我做錯了MainForm.getContainer()。add(panel)或MainForm.placePanel(panel)?每當我嘗試從jPanel使用此代碼(在Jframe內部工作)時,它會發生錯誤。我已經有了placePanel方法,我如何從另一個類調用它? – Luka 2011-04-17 14:15:53