Запуск GridBagLayout из верхнего левого угла в Java Swing

Я новичок в 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 ответов


вы должны использовать GridBagConstraints' anchor собственность. Это должно сделать это за вас:

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

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


прочитайте раздел из учебника Swing на Как использовать GridBagLayout. Сектон на "weightx, weighty" гласит:

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


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

gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.weighty = 1.0;
jPanelOptions.add(jPanelFiller, gridBagConstraints);

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

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

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

    bg.add(new JLabel(" "), gbc);  // blank JLabel

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

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

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


есть обходной путь. Вы можете поместить панель GridBagLayout в панель BorderLayout с BorderLayout.СЕВЕРНЫЙ. После этого компонент в панели 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