Java swing; Как переключить видимость панели?

#java #swing #toggle #visibility #jpanel

#java #swing #переключить #видимость #jpanel

Вопрос:

я создал этот код для навигации по панелям panel1 и panel2 с помощью кнопок.

(button1 и button2) но когда я запускаю свой код, рамка остается пустой.

Кто-нибудь может объяснить мне, что я делаю не так и как я могу выполнить

переключение между panel1 и panel2 таким образом? Сначала начинаем с panel1

Код:

 import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JFrame;

public class togglepanel {

    public static void main(String[] args) {

        final JFrame frame = new JFrame();
        final JPanel panel1 = new JPanel();
        final JPanel panel2 = new JPanel();
        JButton button1 = new JButton("previous frame!");
        JButton button2 = new JButton("next frame");

        frame.setLocationRelativeTo(null);
        frame.setResizable(true);
        frame.setVisible(true);
        frame.setSize(600, 400);
        frame.add(panel1);
        frame.add(panel2);

        panel1.add(button2);
        panel1.setVisible(true);

        panel2.add(button1);
        panel2.setVisible(false);

        button1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {

                panel1.setVisible(true);
                panel2.setVisible(false);

            }
        });


        button2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {

                panel1.setVisible(false);
                panel2.setVisible(true);
            }
        });
    }
}
  

заранее спасибо

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

1. 1 для sscce . Переформатированный код; пожалуйста, верните, если неверно.

Ответ №1:

Используйте менеджер компоновки.

frame.setLayout(новое потоковое описание());

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

1. вау, это работает! это так просто? ха-ха, что именно это добавило, чтобы сделать его более удобным для обучения?

2. Менеджер компоновки управляет настройкой положений и размеров всех компонентов на экране. Если вы не используете менеджер компоновки, вам придется выполнять все позиционирование и калибровку самостоятельно. Вот хорошее объяснение ссылки на менеджеры компоновки

3. Используйте другой менеджер компоновки — JFrame панель содержимого используется BorderLayout по умолчанию. add() Вызывает оба компонента по умолчанию CENTER , и там может быть только один компонент, поэтому второй перезаписывает первый.

Ответ №2:

Другой полезный способ сделать это, и я думаю, что лучше — использовать CardLayout и добавить обе JPanels в контейнер, который использует этот CardLayout. Затем вы можете легко менять представления, вызывая методы CardLayout.

например,

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TogglePanel {
   public static void main(String[] args) {
      final CardLayout cardlayout = new CardLayout();
      final JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      final Container contentPane = frame.getContentPane();
      contentPane.setLayout(cardlayout);

      final JPanel panel1 = new JPanel();
      final JPanel panel2 = new JPanel();
      JButton button1 = new JButton("previous frame!");
      JButton button2 = new JButton("next frame");
      contentPane.setPreferredSize(new Dimension(600, 400));
      contentPane.add(panel1, "Panel 1");
      contentPane.add(panel2, "Panel 2");
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setResizable(true);
      frame.setVisible(true);

      panel1.add(button2);
      panel2.add(button1);

      ActionListener btnListener = new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            cardlayout.next(contentPane);
         }
      };

      button1.addActionListener(btnListener);
      button2.addActionListener(btnListener);

   }
}
  

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

1. о да, я также рассматривал CardLayout, можете ли вы предоставить некоторые преимущества CardLayout, которых нет у другого метода? 🙂

2. CardLayout позаботится о том, чтобы размеры объектов были в порядке, чтобы предпочтительный размер контейнера был предпочтительным размером самого большого компонента card. CardLayout заботится о повторной проверке и перерисовке объектов, поэтому сложнее все испортить. Это также позволяет как последовательную смену карточек (с помощью методов next() и previous()), так и произвольную смену карточек (с помощью строковых констант, которые вы используете для добавления карточек в контейнер).