Как правило, GridBagLayout игнорирует значения, установленные для элементов управления с setSize
, вместо этого он запрашивает элементы управления для их предпочтительного размера (вызывая getPreferredSize
) и использует их для расчета общего макета. Простая установка предпочтительного размера самостоятельно не рекомендуется, поскольку большинство элементов управления, как правило, пересчитывают эти значения при каждом запуске макета, поэтому вам будет сложно заставить их «застрять».
Если вы действительно хотите убедиться, что элемент C пользовательского интерфейса имеет определенный размер, реализуйте его как пользовательский класс, производный от подходящей базы (например, JPanel), и переопределите метод getPreferredSize
, чтобы сделайте так, чтобы он возвращал размер, который вы хотите / нужен для этой части вашего пользовательского интерфейса.
Редактировать: Вот небольшой пример для оболочки, которая может содержать другой элемент пользовательского интерфейса и может быть установлен на фиксированный размер (используя переопределенный метод setSize
), который должен соблюдаться менеджеры по расположению:
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JComponent;
import javax.swing.JPanel;
public class FixedSizeComponent extends JPanel {
private Dimension size;
private final JComponent content;
public FixedSizeComponent(JComponent content) {
super(new BorderLayout());
this.content = content;
super.add(content, BorderLayout.CENTER);
}
@Override
public void setSize(Dimension d) {
size = d;
}
@Override
public void setSize(int width, int height) {
size = new Dimension(width, height);
}
@Override
public Dimension getSize() {
if (size != null) return size;
return content.getSize();
}
@Override
public Dimension getSize(Dimension rv) {
if (size != null) {
if (rv == null) rv = new Dimension();
rv.height = size.height;
rv.width = size.width;
return rv;
}
return content.getSize(rv);
}
@Override
public Dimension getPreferredSize() {
if (size != null) return size;
return content.getPreferredSize();
}
@Override
public Dimension getMaximumSize() {
if (size != null) return size;
return content.getMaximumSize();
}
@Override
public Dimension getMinimumSize() {
if (size != null) return size;
return content.getMinimumSize();
}
}