Вопрос

Я использую 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, если содержимое не заполняет весь контейнер, в котором оно находится, оно автоматически центрирует все свое содержимое внутри своего контейнера.Вот почему вы получаете действительно большой разрыв.

По сути, есть два способа исправить это:

  1. Трудный путь:Поиграйте с GridBagConstraints.У меня был ограниченный успех в этом, когда я пытался избежать центрирующего поведения.
  2. Самый простой способ:Положите GridBagLayout внутри a FlowLayout, а затем установите выравнивание 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:

Это поле используется, когда область отображения компонента больше, чем запрошенный размер компонента.Он определяет, следует ли изменять размер компонента, и если да, то каким образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top