Запуск 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);

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

Ответ 1

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

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

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

Ответ 2

Прочитайте раздел из руководства Swing по Как использовать GridBagLayout. В разделе "Весовые, весомые" говорится:

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

Ответ 3

Для тех, кто использует 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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

Там обходной путь. Вы можете поместить панель 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);
}

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