GridbagLayout, похоже, игнорирует размеры компонентов

Я впервые использую GridBagLayout. У меня есть JFrame с двумя панелями внутри.

  • Рама имеет ширину 1200 и высоту 800.
  • Самый левый JPanel имеет ширину 800 и высоту 800.
  • Самая правая панель имеет ширину 400 и высоту 800.

При рендеринге с использованием GridBagLayout они оба отображаются с одинаковым размером.

Это код:

public class DisplayFrame extends JFrame {
    public DisplayFrame() {

            //simple inheritance. 
            super(title);
            setSize(new Dimension(1200, 800));
            setResizable(false);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);

            addComponents();

        } 

        public void addComponents(){

            this.setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            add(new DisplayCanvas(), gbc);

            gbc.gridx++;
            add(new ControlContainer(), gbc);

        }
    }

public class DisplayCanvas extends JPanel{

    public DisplayCanvas() {

        setPreferredSize(new Dimension(800,800));
        this.setBackground(Color.WHITE);
        this.setVisible(true);

    }

     @Override
     public Dimension getPreferredSize() {
         return new Dimension(800, 800);
     }

}
public class ControlContainer extends JPanel{

    public ControlContainer() {
        setPreferredSize(new Dimension(200,200));
        setBackground(Color.GRAY);
        setVisible(true);

    }

 @Override
     public Dimension getPreferredSize() {
         return new Dimension(400, 800);
     }
}

Без сомнения, мне не хватает чего-то очень очевидного.


person chris edwards    schedule 19.02.2015    source источник
comment
gbc.weightx = 1; и gbc.weighty = 1; переопределяют подсказки размеров, предоставляемые вашими компонентами.   -  person MadProgrammer    schedule 20.02.2015
comment
Я попытался использовать GridBagLayout и для сложных макетов, и в итоге вырвал почти весь код, поскольку он никогда не работал так, как я ожидал, когда у меня были сложные структуры таблиц. Надеюсь, у вас будет лучший опыт! В моем случае я обратился к MigLayout вместо этого, поскольку он не идеален, но, как и GridBagLayout, сложная модель таблицы, но она немного более предсказуема.   -  person Emily Crutcher    schedule 20.02.2015


Ответы (1)


gbc.weightx = 1; и gbc.weighty = 1; отменяют рекомендации по размеру, предоставляемые вашими компонентами. Это в основном обеспечивает равный вес для обоих компонентов, чтобы заполнить оставшееся пространство, доступное для GridBagLayout

Не полагайтесь только на подсказки по размеру, так как размер окна можно изменить.

Также помните, что в раме есть украшения, поэтому рамы не будет (и не должно быть) 1200x800. Разрешите контенту предоставлять информацию о том, что ему нужно, и используйте pack, чтобы убедиться, что видимая область соответствует вашим потребностям, а декорации рамки упакованы вокруг нее. Это приведет к тому, что размер ваших окон, в конечном итоге, больше, чем область содержимого, но область содержимого - это то, что имеет значение.

person MadProgrammer    schedule 20.02.2015