#java #swing #user-interface #jpanel
#java #swing #пользовательский интерфейс #jpanel
Вопрос:
Я хочу добавить 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);
И т.д…
Я знаю, что панель может быть добавлена к панели, потому что я сделал это с помощью borderlayout. Пожалуйста, не говорите мне использовать менеджер компоновки, я использую gridbag, и он не дал желаемых результатов.
Я хотел бы получить полный контроль над размером и размещением моих объектов. Кроме того, пожалуйста, не говорите мне: «Ты тупой; это глупо; зачем тебе вообще это делать?»
Пожалуйста, только полезные ответы! Я не программист-новичок, просто парень, разочарованный графическими интерфейсами, поэтому не стесняйтесь углубляться в глубину, как вам хотелось бы.
Комментарии:
1. Используйте менеджер компоновки. Если один из них не делает того, что вы хотите, тогда используйте другой. Если все они не делают то, что вы хотите, тогда узнайте, как их использовать в деталях, потому что layout manager — это единственный способ настроить макет (ну.. вот почему они называются менеджерами «layout»)
2. @xappymah Не совсем верно, но это рекомендуемый способ выполнения действий — даже если это означает написание пользовательского менеджера макетов.
3. «Пожалуйста, не говори мне …» очевидный ответ — скажи мне, что я хочу услышать. В конце концов, я плачу за этот контракт на поддержку службы поддержки. (Проблема в том, что вы не платите или не обращаетесь в службу поддержки.)
Ответ №1:
Панель содержимого JFrame по умолчанию использует BorderLayout, поэтому каждый раз, когда вы добавляете в нее новую панель, не указывая ее местоположение в макете, она добавляет ее в центр и, таким образом, заменяет предыдущую.
Просто настройте макет панели содержимого на то, что вы хотите. Конечно, вы можете использовать нулевой макет (т. Е. Установить макет null
равным ), но когда-нибудь вас укусит эта ошибка дизайна. Просто потому, что вы не смогли использовать менеджеры компоновки, это не значит, что вы не должны этого делать. Просто продолжай учиться. GridBagLayout — один из самых сложных. Сначала вы могли бы использовать другие.
Ответ №2:
Я хочу добавить 3 JPanels, все на разных расстояниях друг от друга, которые заполняют панель содержимого / JFrame.
В вашем примере панели не расположены на разных расстояниях друг от друга. Панели соединяются друг с другом. Итак, все, что вам нужно сделать, это использовать панель с потоковым описанием, в котором используется горизонтальный зазор, равный 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, x 100), но вы не знаете размер строки заголовка и границ. Таким образом, вы не сможете правильно рассчитать размер.
Может потребоваться еще несколько минут, чтобы разобраться в менеджерах компоновки, но оно того стоит.
Ответ №3:
Есть хороший учебник по обходу без менеджера компоновки, который должен вам помочь. Наиболее важная рекомендация, которую он дает, — это либо использовать IDE, такую как NetBeans, но она также охватывает выполнение действий вручную.
Обратите внимание, что если вы не можете найти LayoutManager по умолчанию, который подходит для вас, вы всегда можете написать свой собственный — хотя в этом случае это звучит так, как будто JSplitPane — это то, что вам нужно — см. Как использовать разделенные панели
Ответ №4:
Менеджеры компоновки позволят вам полностью контролировать размещение и размер ваших компонентов, вам просто нужно найти тот, который достаточно прост для вашего приложения, предоставляя вам необходимый объем контроля. Возможно обойтись без диспетчера компоновки, но я бы никогда не предложил такой способ написания кода GUI, в конечном итоге вы будете управлять слишком большим количеством графических интерфейсов, которые обычно правильно управляются a LayoutManager
(например, управление свободным пространством, изменение размера родительского окна ..).).
Большинство LayoutManager
классов работают одинаково; когда вы добавляете компонент в a Container
, вы также указываете ограничение, которое укажет LayoutManager
, где разместить компонент, и как обрабатывать все типы событий, которые влияют на размещение компонента (например, изменение размера контейнера). Некоторые менеджеры компоновки имеют очень простые ограничения ( BorderLayout
запрашивают только местоположение компонента), в то время как другие имеют очень полный набор ограничений ( GridBagLayout
через GridBagConstraints
класс)
LayoutManager
Я предпочитаю GridBagLayout
(JavaDoc). При правильном использовании GridBagContraints
класса вы можете указать, где отображаются ваши виджеты, какой интервал должен быть между каждым компонентом, как распределяется свободное пространство и т.д.. Этот учебник должен помочь вам начать работу с этим менеджером компоновки.
Если это не соответствует вашим потребностям, или если вы чувствуете, что это слишком сложно, вам следует поискать в Интернете учебные пособия по other LayoutManager
.