GridBagLayout 没有得到预期的结果

GridBagLayout not getting expected result

试图了解 Java 的 GridBagLayout 是如何工作的。以前从未使用过它,所以它可能是我犯的一个愚蠢的错误。

我的objective是在页面的顶部中央放置一个JLabel。我一直在使用 Oracle 上的 java 教程,但没有成功。标签似乎保留在页面的中央。 (中心位于 x 和 y 图的死点)。

据我了解,如果我将 gridxgridy 约束设置为 0,编译器将查看程序的顶部第一行并将文本放置他们的。然后我使用 PAGE START 锚点将文本放在页面的中央。我不完全确定 weightxweighty 函数在我的防御中做了什么。

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);
    }
}

您只是使用容器向 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();
         }
      });
   }
}

我自己,如果我希望我的 JLabel 位于顶部,我会使用 BorderLayout。