Cardlayout на нулевой раскладке
Всякий раз, когда я изменяю макет моего JFrame на ноль, вместо того, чтобы фактически устанавливать его, JPanels никогда не добавляются. Я не уверен, почему, и я не нашел достаточной информации по этой теме. Вот мой класс JFrame:
public class Frame extends JFrame
{
public Frame () {
super("frame");
this.setLayout(null);
this.setIconImage(Toolkit.getDefaultToolkit().getImage(Main.class.getProtectionDomain().getClassLoader().getResource("icon.png")));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(1250, 550);
this.getContentPane().setBackground(Color.GRAY);
}
}
Вот где я создаю экземпляр JFrame:
public static Frame frame;
public static void initialize()
{
frame = new Frame();
CardLayout cardLayout = new CardLayout();
PanelContainer panelContainer = new PanelContainer(cardLayout);
panelContainer.setLayout(cardLayout);
JPanel panel1 = new Panel1();
JPanel panel2 = new Panel2();
panelContainer.add(panel1, "panel1");
panelContainer.add(panel2, "panel2");
cardLayout.show(panelContainer, "panel1");
gui.add(panelContainer, null);
gui.validate();
gui.setVisible(true);
}
Вот класс контейнера панели:
public class PanelContainer extends JPanel
{
public PanelContainer(CardLayout cardLayout)
{
super(cardLayout);
this.setVisible(true);
}
}
И, наконец, вот панели 1 и 2, они имеют одинаковый код:
public class Panel1 extends JPanel
{
public Panel1 ()
{
super();
this.setBackground(Color.GRAY);
addButtons(this);
}
public static void addButtons(FrontPanel panel)
{
JButton testButton = new JButton(new ImageIcon(Images.TestImage);
testButton (30,30);
testButton (0,0);
panel.addtestButton
}
}
Спасибо за ваше время и помощь!
1 ответ
Несколько вопросов:
- Всякий раз, когда вы даете контейнеру нулевую разметку, вы, кодировщик, несете полную ответственность за указание размера и расположения всех добавленных компонентов.
- Если вы этого не сделаете, добавленные компоненты будут иметь размер 0.
- Сказав это, вы почти никогда не должны использовать нулевую разметку, поскольку это приводит к тому, что GUI являются негибкими и почти невозможными для обновления и отладки.
- Ваш код также показывает чрезмерное чрезмерное использование статического всего, что предполагает, что вы могли бы хорошо изучить концепции ООП Java, прежде чем пытаться создавать сложные графические интерфейсы. Создание статических методов и полей приводит к коду, который трудно улучшить, который не может быть унаследован и труден для тестирования, включая модульное тестирование.
Кроме того, я не вижу, где вы добавляете что-либо в JFrame. И вы, похоже, используете переменную gui, которая никогда не объявляется и не инициализируется. Ваша переменная Frame называется frame - может ли gui и frame быть одним и тем же? Вы неправильно написали свой код для нас?
редактировать
... а что касается чрезмерного использования статического "всего"; Я новичок в Java, и я пытаюсь стать лучше в использовании статики, проблема в том, что я не совсем понимаю смысл этого.
Вот почему я настоятельно призываю вас изучить концепции объектно-ориентированного программирования Java, прежде чем пытаться создать сложный графический интерфейс. В противном случае вы рискуете поставить телегу перед лошадью.
Другое дело, что я не использую макет, потому что я хочу много контролировать все,
Именно это и делают менеджеры по макету для вас. Ваше мнение о том, что нулевой макет работает лучше, отмечает вас как новичка, который еще не осознал всю мощь менеджеров макетов. Как только вы это сделаете, вы поймете, почему большинство похожих вопросов о пустых макетах на этом сайте получают ответы, похожие на мои.
просматривая документы оракула, я не нашел макета, который позволил бы мне сделать это. Может быть, вы могли бы предложить что-то для меня, чтобы использовать?
Вы обычно не используете только один макет. Я часто вкладываю JPanels, каждый из которых использует удобный для программиста менеджер компоновки, и таким образом могу создавать приятные и простые в настройке и улучшении GUI. Что касается рекомендаций - я не знаю, как должна выглядеть ваша программа, поэтому я не могу сейчас дать какие-либо конкретные рекомендации.
Удача!