Запутанность содержимого JPanel - PullRequest
5 голосов
/ 13 октября 2011

Я изучаю Java Swing, и я добавил строку меню к фрейму.По умолчанию это должно вызвать jframe.getContentPane().add(child).Когда я запустил скрипт, панель меню не появилась.Но кнопка была в самом верху "y = 0", если это имеет смысл.

Тогда я осознал свою ошибку, которую я фактически должен был внести в меню в строке меню.Затем появилась панель меню.Так что это заставило меня задуматься ... действительно ли "menubar" "contentpane" 2 панели?Это сбивает меня с толку.Потому что это действовало очень похоже на панель.Но getContentPane() возвращает контейнер, а не объект JPanel, поэтому я запутался.

Если так, значит ли это, что единственная вещь, которая выгружается непосредственно в кадр, это просто объекты Jpanel?Следовательно, JButtons, JLabels не находятся непосредственно в кадре ... Означает ли это, что jpanels "вложены"?Еще одна вещь, которая смущает меня.Если jpanel может контролировать расположение объектов, для чего нужен LayoutManager?: S Спасибо, и, пожалуйста, ответьте так, как если бы вам было 2 года, и спросите, почему небо голубое, ха;)

Ответы [ 4 ]

10 голосов
/ 13 октября 2011

Несколько случайных мыслей:

  • Да, JPanels и другие компоненты часто «вложены».Вот где необходимо четкое понимание менеджеров компоновки Swing / AWT.
  • Хотя тип, возвращаемый JFrame getContentPane(), технически является контейнером, он также является JPanel (который наследуется в конечном итоге от контейнера).
  • Я полагаю, что вы можете сделать все, что извлекается из Контейнера, в contentPane, но вам нужно позаботиться о том, чтобы он был непрозрачным.
3 голосов
/ 13 октября 2011

для этого есть метод

frame.setJMenuBar(menuBar);

для современного Java Swing GUI, необязательно объявлять ContentPane, из Java5, и с BorderLayout по умолчанию LayoutManager

затем frame.add(myPanel); // совпадает с frame.add(myPanel, BorderLayout.CENTER) и занимает весь контейнер

базовые сведения о том, как использовать LayourManager

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

getContentPane() всегда возвращает Container экземпляр. Однако вы должны заметить, что JPanel объекты являются Container экземплярами, а также другими классами в среде Swing. Фактический класс возвращаемого экземпляра не имеет значения, поскольку у вас нет контроля над тем, какая реализация Container используется в качестве contentPane (если вы не принудительно указали конкретную contentPane), и в большинстве случаев это не должно быть проблемой.

В JFrame можно добавить множество графических виджетов, например JButton, JLabel и т. Д. Однако они будут автоматически добавлены в связанную панель содержимого.

JPanel не обрабатывает позиционирование объектов, LayoutManager, связанный с вашей панелью; либо автоматически на основе собственного набора правил (например, FlowLayout), либо с помощью ограничений, которые вы указали при добавлении объекта в контейнер (хороший пример - менеджер компоновки GridBagLayout). JavaDoc на LayoutManager обычно содержит достаточно информации, чтобы вы могли начать их использовать.

Вы можете иметь вложенные панели, да. Container может содержать другие Container экземпляров. Хотя это кажется сложным решением, оно позволяет вам точно контролировать, как отображается ваш графический интерфейс. В зависимости от того, какую LayoutManager вы используете, от потребностей, которые вы должны выполнить с помощью пользовательского интерфейса, и от ваших собственных предпочтений / привычек в качестве разработчика, вам может понадобиться меньше или больше вложенных панелей.

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

Вы должны увидеть этот API документ для JComponent.

Если вы посмотрите на иерархию наследования, вы увидите, что JComponent расширяет Component, поэтому JComponent является Компонентом.

Также в разделе Прямые известные подклассы вы можете увидеть список всех классов, расширяющих JComponent, включая JMenuBar и JPanel.

Итак, JMenuBar и JPanel - это еще две специализированные версии JComponent (или Container).

...