Мне нужно изменить размер изображения
Тогда вам не следует использовать JLabel для отображения изображения. Вам не нужны все дополнительные издержки интерфейса JLabel.
Вместо этого вы можете создать пользовательский компонент, расширив JComponent
. Затем вы настраиваете метод paintComponent()
для масштабирования изображения в том виде, в котором оно нарисовано.
Оно правильно заполняется только тогда, когда размеры области содержимого равны, я думаю, кратному 54.
Я бы предположил, что кратно 53 по горизонтали и 55 по вертикали.
Сначала GridBagLayout
выделит пространство для каждого компонента в его предпочтительном размере.
Тогда, если есть дополнительное пространство, он выделит пространство для каждого компонента на основе ограничения веса x / y.
Вы не можете выделить часть пикселя для компонента. Поэтому лучшее, что можно сделать, - это выделить один пиксель, поэтому вам нужно 53 или 55 в зависимости от направления изменения размера.
Я не знаю ни одного менеджера компоновки в JDK, который мог бы предотвратить дополнительное пространство по краям панели
Возможное решение - использовать Relative Layout . Relative Layout
позволяет определять размеры компонентов относительно доступного пространства. После того, как компоненты указаны в относительном размере, это позволяет вам указать, как должны быть выделены «лишние» пиксели.
Чтобы использовать этот подход, вам понадобится главная панель, которая использует RelativeLayout
по вертикали, а затем дочерние панели для каждой строки, которая использует RelativeLayout
по горизонтали.
Итак, лог c может быть что-то вроде:
RelativeLayout verticalLayout = new RelativeLayout(RelativeLayout.Y_AXIS);
verticalLayout.setRoundingPolicy( RelativeLayout.EQUAL );
verticalLayout.setFill(true);
JPanel mapPanel = new JPanel( vertcalLayout );
for (int i = 0; i < rows; i++)
{
RelativeLayout rowLayout = new RelativeLayout(RelativeLayout.X_AXIS);
rowLayout.setRoundingPolicy( RelativeLayout.EQUAL );
rowLayout.setFill(true);
JPanel row = new JPanel( rowLayout );
for (int j = 0; j < cols; j++)
{
CanEnterLbl canEnterLbl = new CanEnterLbl(…);
row.add(canEnterLbl, new Float(1));
}
mapPanel.add(row, new Float(1));
}
Обратите внимание, что RelativeLayout не вычисляет начальный предпочтительный размер, поэтому вам нужно установить его так, чтобы метод frame.pack () работал правильно.