Я бы пошел с GridLayout . GridLayout разделит вашу панель на ячейки в соответствии с заданными строками / столбцами (проверьте ее конструктор). Тогда каждый компонент будет соответствовать 100% (ширина и высота) для ячейки.
Однако: Если вы установите макет сетки на 1 строку и 4 столбца (ваш случай) и добавите только 1 компонент, макет будет настроен следующим образом: 1 строка и 1 столбец, потому что он выиграл т пустое место.
Уловка / Решение: Добавьте пустой компонент точно так же, как мы добавляем пробел в BoxLayout.
private static Component createSpace() {
return Box.createRigidArea(new Dimension(1, 1));
}
Недостаток: Если вы хотите добавить компонент на панель после его отображения, вы должны удалить пробелы, чтобы вам пришлось либо сохранять все пустые компоненты в структуре, либо сделайте следующее (я всегда предпочитаю это):
gridLayoutPanel.removeAll();
gridLayoutPanel.add(component1);
gridLayoutPanel.add(newComponent); //This was space before
gridLayoutPanel.add(createSpace());
gridLayoutPanel.add(createSpace());
gridLayoutPanel.repaint();
gridLayoutPanel.revalidate();
SSCCE будет ( игнорировать высоту компонентов ):
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class GridLayoutTest extends JFrame {
public GridLayoutTest() {
getContentPane().setLayout(new GridLayout(1, 4));
JButton component1 = new JButton("Component1");
JButton component2 = new JButton("Component2");
JButton component3 = new JButton("Component3");
add(component1); //25% of the width
add(component2); //25% of the width
add(component3); //25% of the width
add(createSpace()); //25% of the width
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(500, 200);
setLocationRelativeTo(null);
}
private static Component createSpace() {
return Box.createRigidArea(new Dimension(1, 1));
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new GridLayoutTest().setVisible(true));
}
}
Вы можете использовать% в ограничении столбца, и не забудьте добавить '!' так что каждый столбец имеет фиксированную ширину.
MigLayout migLayout = new MigLayout("wrap 4, fill", "[25%!,fill][25%!,fill][25%!,fill][25%!,fill]");
JPanel panel = new JPanel(migLayout);
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
panel.add(label1, "grow"); // add grow here if you want to fill up the 25%
panel.add(label2, "grow");
также посмотрите http://www.miglayout.com/whitepaper.html , в нем есть все приемы миграции