Рекомендация для Layout Manager
Я создаю графический интерфейс для аркадной игры. Он состоит из одного JFrame с несколькими JPanels и одного JMenu, как показано на рисунке:
Я пытался использовать BorderLayout, но он не показывает панели правильно. Что я получаю, так это то, что JMenu показывает правильно. [1] регулирует ширину в соответствии с содержимым кнопок внутри. JPanel [2] выполняет почти остальную часть экрана. И [3] показывает в виде тонкой линии в конце.
Вот фрагмент кода, который я использую, чтобы поставить их в нужное положение:
add(new TopMenu(), BorderLayout.PAGE_START); // JMenu
add(new LeftPanel(), BorderLayout.WEST); // [1]
add(new StatusPanel(), BorderLayout.CENTER); // [2]
add(new GameUI(), BorderLayout.LINE_END); // [3]
Любые предложения о том, что может вызвать такое поведение, приветствуются.
2 ответа
Вы всегда можете вкладывать JPanels/ контейнеры, каждый из которых использует свой собственный макет. Таким образом, общий макет может быть BorderLayout с меню в BorderLayout.NORTH и JPanel [1] на стороне BorderLayout.EAST, а затем вложить JPanel в позицию BorderLayout.CENTER, используя другой BorderLayout или BoxLayout, и поместить другой два JPanel в этот JPanel. Например, этот CENTER JPanel может использовать BorderLayout и может удерживать JPanel [2] в своей позиции BorderLayout.NORTH и JPanel [3] в своей позиции BorderLayout.CENTER.
Ваш JPanel
должны иметь компоненты Swing внутри, иначе они будут уменьшаться до минимального размера, когда вы вызываете pack() на JFrame
,
Поскольку вы создаете игру, вам нужно установить предпочтительный размер JPanel
и установите предпочтительный размер на JFrame
, Я предполагаю, что вы захотите нарисовать хотя бы один из JPanel
компоненты непосредственно с помощью paintComponent
метод.
Вы можете вкладывать JPanel-2 и JPanel-3 в правую панель. Ты можешь использовать FlowLayout
для самой правой панели, а также помещая JPanel-1 и rightPanel в JFrame
,
Если вы настаиваете на использовании менеджера макета, который выложит 3 JPanel
без вложенности, вам придется использовать GridBagLayout
, JPanel-1 будет иметь ширину в 1 столбец и глубину в 2 строки. JPanel-2 будет иметь ширину 1 и 1 столбец. JPanel-3 будет иметь ширину 1 столбец и глубину 1 столбец.
Вам все равно придется установить предпочтительный размер 3 JPanel
"S.