При использовании GridLayout он равномерно распределяет пространство своего контейнера между элементами строки и столбца. Однако, когда вычисление ширины ячейки не получается целым числом, избыточное пространство помещается между краями контейнера и его содержимым таким образом, что содержимое контейнера центрируется GridLayout.
На этом изображении вы можете видеть превышение пространства (окрашено зеленым цветом):
Поскольку размер кадра перетаскивается на 233x233, LayoutManager будет предлагать каждому компоненту пол (233/20) = 11 пикселей по высоте и ширине. При этом 233% 20 = 13 пикселей превышают и ставятся по краям.
Это код для создания кадра на картинке:
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout layout = new GridLayout(20, 0);
layout.setHgap(0);
layout.setVgap(0);
frame.setLayout(layout);
for (int j = 0; j < 20; j++) {
for (int i = 0; i < 20; i++) {
JPanel panel = new JPanel();
panel.setBackground((i + j) % 2 == 0 ? Color.BLACK : Color.WHITE);
frame.add(panel);
}
}
frame.pack();
frame.getContentPane().setBackground(Color.GREEN);
frame.setVisible(true);
Поэтому мне интересно, есть ли простой способ сделать контейнер «обрезным» или выровнять таким образом, чтобы это превышение пространства не отображалось, а вместо этого размер контейнера изменялся, чтобы идеально соответствовать его содержимому.
GridBagLayout
обрабатывает дополнительные пиксели пространства лучше, чемGridLayout
. Назначая веса компонентам, мы можем контролировать, какие столбцы и строки первыми получат дополнительное пространство. - person Andrew Thompson   schedule 29.12.2016