У меня есть a JPanel
который использует a BoxLayout
в X_AXIS
направление. Проблему, которую я имею, лучше всего показывает изображение:
Поскольку Вы видите JPanel
слева, центрировался, а не выравнивался наверху. Я хотел бы, чтобы они оба были выровненные наверху и сложенные слева направо, как я могу достигнуть этого с этим менеджером по расположению? Код, который я написал, следующие:
public GameSelectionPanel(){
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
setAlignmentY(TOP_ALIGNMENT);
setBorder(BorderFactory.createLineBorder(Color.black));
JPanel botSelectionPanel = new JPanel();
botSelectionPanel.setLayout(new BoxLayout(botSelectionPanel, BoxLayout.Y_AXIS));
botSelectionPanel.setBorder(BorderFactory.createLineBorder(Color.red));
JLabel command = new JLabel("Please select your opponent:");
ButtonGroup group = new ButtonGroup();
JRadioButton button1 = new JRadioButton("hello world");
JRadioButton button2 = new JRadioButton("hello world");
JRadioButton button3 = new JRadioButton("hello world");
JRadioButton button4 = new JRadioButton("hello world");
group.add(button1);
group.add(button2);
group.add(button3);
group.add(button4);
botSelectionPanel.add(command);
botSelectionPanel.add(button1);
botSelectionPanel.add(button2);
botSelectionPanel.add(button3);
botSelectionPanel.add(button4);
JPanel blindSelectionPanel = new JPanel();
blindSelectionPanel.setBorder(BorderFactory.createLineBorder(Color.yellow));
blindSelectionPanel.setLayout(new BoxLayout(blindSelectionPanel, BoxLayout.Y_AXIS));
JRadioButton button5 = new JRadioButton("hello world");
JRadioButton button6 = new JRadioButton("hello world");
ButtonGroup group2 = new ButtonGroup();
group2.add(button5);
group2.add(button6);
JLabel blindStructureQuestion = new JLabel("Please select the blind structure:");
blindSelectionPanel.add(blindStructureQuestion);
blindSelectionPanel.add(button5);
blindSelectionPanel.add(button6);
add(botSelectionPanel);
add(blindSelectionPanel);
setVisible(true);
}
Что ж, метод setAlignmentY
здесь не действует, поскольку он действует на панель, рассматриваемую как компонент.
Как вы уже догадались, компоновка содержащихся панелей определяется менеджером компоновки, который вы используете.
К сожалению, BoxLayout
не предоставляет ту функцию, на которую вы смотрите.
в стандартном JDK, очевидно, предпочтительным вариантом для вашей задачи является GridBagLayout
. Хотя поначалу это довольно сложно понять, он быстро откроет вам свои возможности в компоновке компонентов.
используя полезный класс GBC , ваши компоненты могут быть расположены следующим образом:
setLayout(new GridBagLayout(this));
add(botSelectionPanel, new GBC(0,1).setAnchor(TOP));
add(blindSelectionPanel, new GBC(0,2).setAnchor(TOP));
или я так думаю; -)
Ридел прав относительно установки setAlignmentY
в самой GameSelectionPanel
и GridBagLayout
- отличная альтернатива. Если вы предпочитаете использовать BoxLayout
, статья Устранение проблем с выравниванием обсуждает этот вопрос, предлагая «все компоненты, управляемые расположением BoxLayout слева направо, обычно должны иметь одинаковое выравнивание по оси Y». . " В вашем примере добавьте
botSelectionPanel.setAlignmentY(JPanel.TOP_ALIGNMENT);
blindSelectionPanel.setAlignmentY(JPanel.TOP_ALIGNMENT);