如果你想从另一个对象中调用对象的方法,你会需要一个参考的第一个对象,所以你可以调用方法的活动对象本身,而不是对班级(正如你现在正在做的那样)。解决这个问题的一种方法是将一个对持有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