从外部类切换Java中的jPanel

时间:2011-04-17 13:49:23

标签: java containers jframe jpanel switch-statement

我有jFrameMainForm,其中包含main()placePanel(panel)和下拉菜单。从下拉菜单中的项目中,我调用placePanel(panel)方法将特定面板放在jFrame容器中。这很好。

但是,当我点击jPanel课程内的按钮时,我不知道如何切换面板。当我尝试从加载到jFrame容器中的任何MainForm.placePanel(panel)调用jPanel的{​​{1}}时,我收到错误:jFrame等。还试过cannot reference non-static content,但它也不起作用。

我无法弄清楚如何从另一个类访问Mainform.getContainer().add(panel)的容器,或者如何使用另一个面板中的方法切换面板。

由于

1 个答案:

答案 0 :(得分:2)

如果要从另一个对象中调用对象上的方法,则需要对第一个对象进行引用,这样就可以在活动对象本身而不是类上调用该方法(就像你一样)目前正在尝试这样做)。解决此问题的一种方法是将包含JPanels的类的引用传递给具有按钮的动作侦听器代码的类,可能在后者的构造函数中。换句话说,您需要将对当前活动且可视化的MainForm对象的引用传递给具有该按钮的ActionListener的类。

顺便问一下,您是否正在使用CardLayout交换JPanel?如果没有,我建议您调查一下,因为这通常是最简单的方法。

编辑:

例如,假设你有一个名为MainForm的类,它有一个名为swapJPanels的公共方法,允许它交换视图,另一个类MyPanel,你的JButton想要从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
   }
}