В Java, как вы добавляете JPanel в другой JPanel - PullRequest
1 голос
/ 22 октября 2011

Я хочу добавить 3 JPanels, все на разном расстоянии друг от друга, которые заполняют панель содержимого / JFrame. В настоящее время add (new JPanel ()) перезапишет текущую панель содержимого или не будет отображаться вообще.

В идеале я хочу, чтобы код был похож (например, ради):

JPanel panel1 = new JPanel();
panel1.add(new jbutton())
panel1.setBounds(0,0,100,100);

JPanel panel2 = new JPanel();
panel2.add(new jbutton());
panel2.setBounds(100,0,100,100);

getContentPane().add(panel1);
getContentPane().add(panel2);

Etc ...

Я знаю, что панель можно добавить к панели, потому что я сделал это с помощью borderlayout. Пожалуйста, не говорите мне использовать менеджер макетов, я использую gridbag, и он не дал желаемых результатов.

Я хотел бы получить полный контроль над размером и расположением моих объектов. Кроме того, пожалуйста, не говорите мне: «ты тупой; это глупо; зачем тебе это вообще нужно?»

Пожалуйста, только полезные ответы! Я не программист noob, просто парень, разочарованный в GUI, так что не стесняйтесь углубляться в столько глубины, сколько захотите.

Ответы [ 4 ]

2 голосов
/ 22 октября 2011

Панель содержимого JFrame по умолчанию использует BorderLayout, поэтому каждый раз, когда вы добавляете в нее новую панель, не указывая ее расположение в макете, она добавляет ее в центр и, таким образом, заменяет предыдущую. *

Просто установите макет панели содержимого на то, что вы хотите. Вы, конечно, можете использовать нулевой макет (то есть установить макет на null), но вы будете укушены этой ошибкой дизайна через некоторое время. То, что вы не можете использовать менеджеры компоновки, не означает, что вы не должны. Просто продолжай учиться. GridBagLayout - один из самых сложных. Сначала вы можете использовать другие.

1 голос
/ 22 октября 2011

Я хочу добавить 3 JPanels, все на разном расстоянии друг от друга, которые заполняют панель содержимого / JFrame.

В вашем примере панели не разнесены на разные расстояния.Панели соединяются друг с другом.Так что все, что вам нужно сделать, это использовать панель с FlowLayout, которая использует горизонтальный зазор 0.

Ваш основной код может быть что-то вроде:

JPanel main = new JPanel( new FlowLayout(FlowLayout.CENTER, 0, 0) );

JPanel panel1 = new JPanel();
panel1.setPreferredSize( new Dimension(100, 100) );
panel1.add( new JButton() );
main.add( panel1 );

JPanel panel2 = new JPanel();
panel2.setPreferredSize( new Dimension(100, 100) );
panel2.add( new JButton() );
main.add( panel2 );

frame.add( main );

Учитывая, что вы найдете код макетакак это сбивает с толку, я бы сказал, что вы действительно не понимаете, как использовать менеджеры по расположению.И, как и всем остальным, я предлагаю вам потратить время на то, чтобы понять, как использовать менеджеры макетов в ваших интересах.

Кстати, использование нулевого макета НЕ делает вашу жизнь проще.Конечно, вы можете разместить компоненты именно там, где вы хотите, но вы удовлетворяете своему требованию, чтобы панели занимали все пространство панели содержимого?Вы не сможете использовать метод pack () для фрейма, потому что при использовании нулевого макета ваша «основная» панель не будет иметь предпочтительного размера, поэтому, когда вы сделаете фрейм видимым, все, что вы увидите, это заголовокБар и границы.Если вы попытаетесь вручную установить размер рамки, то да, вы знаете размер 3 панелей (300, х 100), но вы не знаете размер строки заголовка и границ.Таким образом, вы не сможете правильно рассчитать размер.

Понятие менеджеров компоновки может занять несколько минут, но оно того стоит.

1 голос
/ 22 октября 2011

Есть хорошее руководство по Обойтись без менеджера макетов , которое должно вам помочь. Самая важная рекомендация, которую он дает, - это использовать IDE, такую ​​как NetBeans , но она также охватывает ручную работу.

Обратите внимание, что если вы не можете найти LayoutManager по умолчанию, который работает для вас, вы всегда можете написать свой собственный - хотя в этом случае он звучит так: JSplitPane - это то, что вам нужно - см. Как использовать разделенные панели

0 голосов
/ 22 октября 2011

Менеджеры компоновки позволят вам полностью контролировать размещение и размер компонентов, вам просто нужно найти тот, который достаточно прост для вашего приложения, и при этом предоставит вам необходимый уровень контроля. Обойтись без менеджера компоновки возможно, но я бы никогда не предложил такой способ написания кода GUI, вы в конечном итоге будете управлять слишком многими вещами GUI, которые обычно правильно управляются LayoutManager (такими как управление свободным пространством, родительское окно размер ..).

Большинство LayoutManager классов работают одинаково; Когда вы добавляете компонент к Container, вы также указываете ограничение, которое сообщит LayoutManager, где разместить компонент и как обрабатывать все типы событий, которые влияют на размещение компонента (например, изменение размера). контейнер). Некоторые менеджеры компоновки имеют очень простые ограничения (BorderLayout запрашивает только местоположение компонента), тогда как другие имеют очень полный набор ограничений (GridBagLayout, через класс GridBagConstraints)

Мне нравится LayoutManager GridBagLayout ( JavaDoc ). При правильном использовании класса GridBagContraints вы можете указать, где будут отображаться ваши виджеты, какое расстояние должно быть между каждым компонентом, как распределяется свободное пространство и т. Д. Этот учебник должен помочь вам начать работу с этим менеджером макета.

Если этот файл не соответствует вашим потребностям, или если вы считаете, что он слишком сложный, вам следует поискать в Интернете учебники по другим LayoutManager.

...