Дополнительная информация была добавлена: Кнопки имеют 50% от ширины и [о] 20% от высоты родителя (вместе 50% высоты, включая промежуток между ними). (Немного переписано в соответствии с предложением.)
Решением
Сочетание простых макетов макетов. Хотя, если вы будете это делать, как это вы будете иметь 3 колонки или 3 строки, которые не могут быть соединены, остальные могут быть легко изменены позже:
// row variation
JPanel parent = new JPanel();
parent.setLayout(new GridLayout(3, 1));
parent.add(new JPanel()); // placeholder for 1st row
JPanel row = new JPanel(); // 2nd row
row.setLayout(new GridLayout(1, 3)); // create 3 cells of equal size
row.add(new JPanel()); // 2nd row, 1st cell placeholder
// now you have a 33% x 33% (oops) rectangle in the middle
JPanel controls = new JPanel();
controls.setLayout(new GridLayout(2, 1, 10, 10));
controls.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10);
controls.add(new JButton("Client"));
controls.add(new JButton("Server"));
row.add(controls); // add 2nd row, 2nd cell
row.add(new JPanel()); // 2nd row, 3rd cell placeholder
parent.add(row); // add 2nd row
parent.add(new JPanel()); // placeholder for 3rd row
Легко, но вы не сможете присоединиться к клеткам позже:
JPanel parent = new JPanel(); parent.setLayout (newGridLayout (9, 9));
Подводя итог: объедините различные менеджеры по размещению, поместите свои 2 кнопки внутри панели и поместите некоторые заполнители внутрь, затем он также должен отлично работать с GridBagLayout. Тем не менее, я постараюсь оставаться гибким, написав многоразовые компоненты, которые могут быть легко объединены с любым менеджером компоновки. Тогда вам не нужно использовать лишний код заполнителей, чтобы правильно отображать компоненты.
Старый Ответ
Альтернативное решение: Используйте BoxLayout
BoxLayout более интуитивным и проще понять, если смотреть на код (конечно, это только мнение).
Решите, как structered ваше окно (это больше похоже на больших горизонтальных компонентов на верхней части друг друга PAGE_AXIS
или большие вертикальные компоненты рядом друг с другом LINE_AXIS
) и использовать в качестве внешнего BoxLayout:
JPanel content = new JPanel(); // or frame
content.setLayout(new BoxLayout(content, BoxLayout.LINE_AXIS));
Добавьте компоненты вдоль оси, где у вас есть более одного компонента вдоль другой оси, используйте второй BoxLayout. Вы можете размещать компоненты, создавая жесткие области (пустые прямоугольники всегда имеют одинаковый размер) или путем добавления клея (расширяющегося, как жевательная резинка, вместе с компонентами).
content.add(BoxLayout.createHorizntalGlue());
JPanel col = new JPanel();
col.setLayout(new BoxLayout(col, BoxLayout.PAGE_AXIS));
JButton clientBtn = new JButton("Client");
JButton serverBtn = new JButton("Server");
col.add(BoxLayout.createVerticalGlue());
col.add(clientBtn);
col.add(BoxLayout.createRigidArea(new Dimension(1, 10)));
col.add(serverBtn);
col.add(BoxLayout.createVerticalGlue());
content.add(col);
content.add(BoxLayout.createHorizontalGlue());
Вы уверены, что кнопки не покрывают целую ячейку сетки? Вы добавляете их в положение (5,5). И если вы просто хотите сыграть две кнопки друг над другом FlowLayout, все больше подходят GridLayout, BorderLayout и BoxLayout. – maraca
Я использовал 5,5 только для того, чтобы учесть, если мне когда-либо понадобится добавить что-нибудь в сторону, мне не нужно менять координаты сетки. – JavaFanatic