Запуск GridBagLayout из верхнего левого угла в Java Swing - PullRequest
12 голосов
/ 16 июня 2011

Я новичок в Java Swing, и я изо всех сил пытался запустить GridBagLayout из верхнего левого угла, чтобы c.gridx = 0 c.gridy = 0 поместил мой объект в верхний левый угол.

Буду признателен, если вы поможете мне, рассказав, что мне нужно сделать после этого:

    JPanel panel = new JPanel(new GridBagLayout());
    frame.add(panel);
    GridBagConstraints c = new GridBagConstraints();

Я знаю, что должен использовать константы NORTHWEST или FIRST_LINE_START, но не знаю как.Я пытался сделать это таким образом », но константы не поняли.

    frame.getContentPane().add(panel, BorderLayout.NORTHWEST);

Спасибо за вашу помощь.

Ответы [ 6 ]

15 голосов
/ 16 июня 2011

Прочтите раздел из учебника по Swing на Как использовать GridBagLayout . Секта о «весе, весе» гласит:

Если вы не укажете хотя бы одно ненулевое значение для weightx или weightty, все компоненты слипаются в центре своего контейнера.

12 голосов
/ 16 июня 2011

Вам необходимо использовать вашу собственность GridBagConstraints 'anchor. Это должно сделать это для вас:

frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.NORTHWEST;
frame.add(panel, gbc);

Я не гарантирую, что вам не придется устанавливать другие свойства объекта ограничений, чтобы получить желаемый макет. В частности, вам может потребоваться установить widthx и widthy равными 1, чтобы панель занимала все доступное ей пространство.

5 голосов
/ 21 июля 2012

Для тех, кто использует IDE (например, NetBeans), я наконец нашел хороший трюк: если вы хотите добавить компоненты сверху и использовать их предпочтительные размеры: добавьте еще одну пустую панель с весом = 1,0.Скопировано из автоматически сгенерированного кода (NetBeans):

gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.weighty = 1.0;
jPanelOptions.add(jPanelFiller, gridBagConstraints);
4 голосов
/ 18 августа 2015

быстрый и простой способ:

добавить пустой JLabel в конец страницы:

    // your code goes here
    gbc.weightx = 1;
    gbc.weighty = 1;

    bg.add(new JLabel(" "), gbc);  // blank JLabel
2 голосов
/ 13 ноября 2016

Есть обходной путь. Вы можете поместить панель GridBagLayout в панель BorderLayout с помощью BorderLayout.NORTH. Затем Компонент на панели GridBagLayout начнется с верхней позиции.

static void test4(){
    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(480, 360);

    JPanel borderLayoutPanel=new JPanel(new BorderLayout());
    JPanel gridBagLayoutPanel = new JPanel(new GridBagLayout());
    borderLayoutPanel.add(gridBagLayoutPanel, BorderLayout.NORTH);
    frame.add(borderLayoutPanel);

    JButton testButton=new JButton("test button");
    GridBagConstraints c = new GridBagConstraints();
    c.gridx=0;
    c.gridy=0;
    gridBagLayoutPanel.add(testButton, c);

    frame.setVisible(true);
}

enter image description here

0 голосов
/ 17 июля 2014

Если вы хотите, чтобы сетка шла до самого верха, просто установите все ваши весовые = 0 до последнего элемента, установите для него любое число больше 0, это будет эффективно толкать остальные кнопки вверх .

Не забудьте также увеличить значение сетки вашей кнопки.

В противном случае оно будет отцентрировано. (то же самое можно сделать с использованием значения gridx и weightx, если вы не используете свойство c.fill = GridBagConstraints.HORIZONTAL.)

...