Переключение JPanels в Java из внешнего класса

#java #containers #jframe #jpanel #switch-statement

#java #контейнеры #jframe #jpanel #switch-инструкция

Вопрос:

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

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

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

Спасибо

Ответ №1:

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

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

Редактировать:

Например, допустим, у вас есть класс с именем MainForm, который имеет открытый метод с именем swapJPanels, который позволяет ему менять местами представления, и другой класс MyPanel, в котором есть ваш JButton, который хочет вызвать метод из класса MainForm, тогда вы могли бы предоставить MyPanel конструктор, который принимает параметр MainForm и позволяет передавать ссылку из текущего объекта MainForm (это внутри класса) в объект MyPanel:

Основная форма:

 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
   }
}
  

Комментарии:

1. Я не использую CardLayout, я ничего не знаю о, и это первый раз, когда я услышал об этом. Я собираюсь посмотреть это и посмотреть, что это делает. Кроме того, что вы подразумеваете под «передачей ссылки»? Я уже пытался ссылаться на основную форму JFrame из JPanel, используя: MainForm.getContainer().add (панель)? Я знаю, что это неправильно, но как мне правильно «передать ссылку»?

2. @Luka: вы можете найти руководство по его использованию здесь: Как использовать CardLayout , но поймите, что это не решит вашу первоначальную проблему — наличие и вызов методов для ссылки на один объект внутри другого объекта.

3. Хорошо, макет карты интересен, но это обходной путь. Но что я делаю не так с MainForm.getContainer().add (панель) или MainForm.placePanel (панель)? Всякий раз, когда я пытаюсь использовать этот код (который работает внутри Jframe) из JPanel, он выдает ошибку. У меня уже есть метод placePanel, как мне вызвать его из другого класса?

4. @Luka: Снова вы пытаетесь вызвать метод в классе MainForm, и это просто не сработает. Вам нужно вызвать метод для объекта MainForm . Если вы не понимаете разницы, вам, вероятно, следует отказаться от программирования в графическом интерфейсе, пока вы не овладеете основами. Эти руководства могут вам помочь: Java Tutorials

5. Ваш последний пост теперь мне как-то понятнее, спасибо 🙂 Как я понимаю, object является экземпляром класса. Если я хочу вызвать объект MainForm, что мне нужно сделать: создать MainForm? Я думаю, что я это сделал, но это привело к появлению новой основной формы, поэтому у меня их было 2…