GridBagLayout не получает ожидаемого результата

Пытаюсь понять, как работает GridBagLayout для Java. Никогда не использовал его раньше, так что, вероятно, это глупая ошибка, которую я сделал.

Моя цель — разместить JLabel вверху по центру страницы. Я использовал учебники по Java для Oracle, но мне не повезло. Кажется, этикетка остается в центре страницы. (центр как мертвая точка графика x и y).

Насколько я понял, если я установлю ограничение gridx и gridy на 0, компилятор будет смотреть на верхнюю, первую строку программы и размещать текст там. Затем я использовал привязку PAGE START, чтобы поместить текст в центр страницы. Я не совсем уверен, что функции weightx и weighty делают в мою защиту.

import javax.swing.*;
import java.awt.*;

class test
{
    public static void main (String Args [])
    {
    //frame and jpanel stuff
    JFrame processDetail = new JFrame("Enter information for processes");
    JPanel panelDetail = new JPanel(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    //label to add on top centre
    JLabel label = new JLabel("LOOK AT ME");

    //set size of frame and operation
    processDetail.setSize(500,500);
    processDetail.setDefaultCloseOperation(processDetail.EXIT_ON_CLOSE);

    //add the label to panel
    c.fill = GridBagConstraints.HORIZONTAL;
    c.anchor = GridBagConstraints.PAGE_START;
    c.weightx = 0; //not sure what this does entirely
    c.gridx = 0; //first column
    c.gridy = 0; //first row
    panelDetail.add(label, c);

    processDetail.add(panelDetail);
    processDetail.setVisible(true);
    }
}

person lecardo    schedule 13.03.2015    source источник
comment
Покажите изображение того, чего вы пытаетесь достичь и что вы в настоящее время получаете.   -  person Hovercraft Full Of Eels    schedule 13.03.2015


Ответы (1)


Вы добавляете только одну вещь в GBL с помощью контейнера, поэтому она будет центрирована. Если вы добавите второй компонент под JLabel, JLabel появится вверху. Например,

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.*;

public class Test2 {
   private static void createAndShowGui() {
      JPanel mainPanel = new JPanel(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 0;
      gbc.gridy = 0;
      gbc.gridheight = 1;
      gbc.gridwidth = 1;
      gbc.weightx = 1.0;
      gbc.weighty = 1.0;
      gbc.fill = GridBagConstraints.BOTH;
      gbc.anchor = GridBagConstraints.PAGE_START;

      mainPanel.add(new JLabel("Look at me!", SwingConstants.CENTER), gbc);   


      gbc.gridy = 1;
      gbc.gridheight = 10;
      gbc.gridwidth = 10;

      mainPanel.add(Box.createRigidArea(new Dimension(400, 400)), gbc);

      JFrame frame = new JFrame("Test2");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Лично я бы использовал BorderLayout, если бы хотел, чтобы мой JLabel был наверху.

person Hovercraft Full Of Eels    schedule 13.03.2015