#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()), так и произвольную смену карточек (с помощью строковых констант, которые вы используете для добавления карточек в контейнер).