2011-04-17 58 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