Переключение jPanels в Java из внешнего класса - PullRequest
1 голос
/ 17 апреля 2011

У меня есть jFrame класс MainForm, который содержит main(), placePanel(panel) и выпадающее меню.Из элементов в выпадающем меню я вызываю метод placePanel(panel), чтобы поместить определенную панель в контейнер jFrame.Это прекрасно работает.

Но я не знаю, как переключать панели, когда я нажимаю на кнопку, которая находится внутри класса jPanel.Когда я пытаюсь вызвать jFrame MainForm.placePanel(panel) из любого jPanel, который загружен в контейнер jFrame, я получаю сообщение об ошибке: cannot reference non-static content и т. Д. Я также пытался Mainform.getContainer().add(panel), но это не такэто тоже не работает.

Я не могу понять, как получить доступ к контейнеру MainForm из другого класса или как переключать панели с помощью метода из другой панели.

Спасибо

1 Ответ

2 голосов
/ 17 апреля 2011

Если вы хотите вызвать метод для объекта из другого объекта, вам понадобится ссылка на первый объект, чтобы вы могли вызывать метод для самого активного объекта, а не для класса (как вы сейчас пытаюсь сделать). Один из способов решить эту проблему - передать ссылку на класс, содержащий JPanels, в класс, содержащий код прослушивателя действия кнопки, возможно, в конструкторе последней. Другими словами, вы захотите передать ссылку на текущий активный и визуализированный объект MainForm в класс, который имеет ActionListener для кнопки.

Кстати, вы меняете JPanels с помощью CardLayout? Если нет, я предлагаю вам изучить это, поскольку это обычно самый простой способ сделать это.

Edit:

Например, скажем, у вас есть класс с именем 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
   }
}
...