Заполнение GridBagLayout
-
22-09-2019 - |
Вопрос
Я использую GridBagLayout
для (в данный момент) отображения двух строк.Я знаю, что этот макет излишен для этой задачи, но я пытаюсь научиться им пользоваться.Проблема в том, что я добавил две панели в две отдельные строки, и вокруг содержимого образовался огромный пробел (см. Изображение и код ниже).:альтернативный текст http://www.imagechicken.com/uploads/1264533379009864500.png
Image background;
public Table(){
super();
ImageIcon ii = new ImageIcon(this.getClass().getResource("pokerTableV2.png"));
background = ii.getImage();
setSize(Constants.FRAME_WIDTH, Constants.TABLE_HEIGHT);
setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.fill = GridBagConstraints.HORIZONTAL;
JButton button = new JButton("hello world");
JPanel panel1 = new JPanel();
panel1.setPreferredSize(new Dimension(800,100));
panel1.add(button, BorderLayout.CENTER);
panel1.setBackground(Color.yellow);
add(panel1, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
JPanel middlePanel = new JPanel();
middlePanel.setPreferredSize(new Dimension(800,350));
middlePanel.add(button, BorderLayout.CENTER);
middlePanel.setBackground(Color.blue);
add(middlePanel, constraints);
}
Решение
К сожалению, с GridBagLayout
, если содержимое не заполняет весь контейнер, в котором оно находится, оно автоматически центрирует все свое содержимое внутри своего контейнера.Вот почему вы получаете действительно большой разрыв.
По сути, есть два способа исправить это:
- Трудный путь:Поиграйте с
GridBagConstraints
.У меня был ограниченный успех в этом, когда я пытался избежать центрирующего поведения. - Самый простой способ:Положите
GridBagLayout
внутри aFlowLayout
, а затем установите выравниваниеFlowLayout
в верхний левый угол, или как вам угодно.
Я спрашивал и отвечал, этот вопрос я сам где-то на прошлой неделе.
Итак, в вашем случае вы добавляете свой panel1
и middlePanel
непосредственно в JFrame (?), с помощью GridBagLayout
JFrame (GridBagLayout)
- panel1
- middlePanel
Вместо этого я бы предложил эту альтернативную структуру, чтобы избавиться от всего лишнего пространства (и выравнивания по центру, если хотите).
JFrame (FlowLayout)
- JPanel (GridBagLayout)
- panel1
- middlePanel
HTH
Другие советы
Использование
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = 1d;
constraints.weighty = 1d;
Javadoc для weightx
/weighty
говорит:
Указывает, как распределить дополнительное горизонтальное / вертикальное пространство.
Javadoc для fill
:
Это поле используется, когда область отображения компонента больше, чем запрошенный размер компонента.Он определяет, следует ли изменять размер компонента, и если да, то каким образом.