привязка java GridBagLayout

Изучая GridBagLayout, проблема в том, что метка имени и поле со списком не отображаются в верхней части панели, но я установил ее привязку на СЕВЕР. Почему ?

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Test2 {    
    public Test2() {
        JFrame frame = new JFrame();
        frame.setTitle("test");
        frame.getContentPane().setLayout(new GridLayout(1,2));
        frame.setSize(800, 600);

        JPanel panel1 = new JPanel();
        panel1.setLayout(new GridBagLayout());

        JLabel label = new JLabel("name");
        GridBagConstraints gridBagConstraints = new GridBagConstraints();   
        gridBagConstraints.anchor = GridBagConstraints.NORTH;
        gridBagConstraints.weightx = 0.0;
        gridBagConstraints.weighty = 0.0;
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        panel1.add(label, gridBagConstraints);

        String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
        JComboBox petList = new JComboBox(petStrings);
        gridBagConstraints = new GridBagConstraints();
        gridBagConstraints.anchor = GridBagConstraints.NORTH;
        gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 0.0;
        gridBagConstraints.gridx = 1;
        gridBagConstraints.gridy = 0;
        panel1.add(petList, gridBagConstraints);    

        frame.getContentPane().add(panel1);
        frame.getContentPane().add(new JPanel());       

        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);      
    }

    public static void main(String[] args) {
        new Test2();
    }
}

person user595234    schedule 29.01.2011    source источник


Ответы (1)


Вы должны изменить

gridBagConstraints.weighty = 0.0;

to

gridBagConstraints.weighty = 1.0;

в противном случае область, зарезервированная для компонента, уменьшается до размера компонента, и не имеет значения, в каком направлении вы «привязываете» компонент.

Результат после изменения weighty следующий:

введите здесь описание изображения

person aioobe    schedule 29.01.2011
comment
да ты прав. Вы имеете в виду, что когда якорь установлен на СЕВЕР, тогда вес должен быть 1,0? - person user595234; 30.01.2011
comment
Ну, если вы хотите, чтобы компоненту была предоставлена ​​​​некоторая площадь (больше, чем сам компонент) для размещения, вам нужен ненулевой вес. (То есть вес 0,1 тоже подойдет в этом конкретном случае.) - person aioobe; 30.01.2011
comment
Я всегда путаю двойное значение, в чем разница между 1,0 и 0,5? - person user595234; 30.01.2011
comment
Если у вас есть другой компонент выше или ниже, веса определяют, какой компонент занимает больше всего места. Если у вас есть один с весом 1,0, а другой с весом 3,0, то они получают 25% и 75% доступного пространства соответственно. - person aioobe; 30.01.2011
comment
Насколько я помню, у Weightx и Weighty максимальное значение 1.0, это правильно? - person user595234; 30.01.2011
comment
Нет, я не верю, что у них есть верхний предел. - person aioobe; 30.01.2011