为什么 GridBagLayout 将我的组件居中,而不是把它放在角落里?

2022-09-02 12:23:58

到目前为止,我设法尽可能避免使用(手动代码),但这次我无法避免它,我正在阅读SUN的教程GridBagLayout到目前为止,它并不顺利。我想我错过了一些东西。
例如,我尝试以下代码(类似于SUN帖子中的代码):GridBagLayout

public class MainFrame extends JFrame { 


    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame
     */
    public MainFrame() {
        super();
        setBounds(100, 100, 500, 375);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container mainContainer = getContentPane();

        mainContainer.setLayout(new GridBagLayout());       

        //add label
        JLabel someLabel = new JLabel("Label 1:");
        GridBagConstraints constraints = new GridBagConstraints();

        constraints.gridx = 0;
        constraints.gridy = 0;
        //constraints.anchor = GridBagConstraints.FIRST_LINE_START;
        //constraints.weightx = 0.5;
        mainContainer.add(someLabel, constraints);      

        JTextField someText = new JTextField(30);

        constraints = new GridBagConstraints();

        constraints.gridx = 1;
        constraints.gridy = 0;
        constraints.weightx = 0.5;
        mainContainer.add(someText, constraints);

        //
    }

}

我在框架的中心得到标签和文本字段一个挨着另一个。
但是我期望它们会出现在左上角,因为 gridx 和 gridy 对于标签是 0。
即使我设置的结果仍然相同。
我在这里错了吗?
来自太阳的帖子:constraints.anchor = GridBagConstraints.FIRST_LINE_START;

指定组件左上角的行和列。最左边的列具有地址 gridx=0,顶行的地址 gridy=0。


答案 1

添加到 JLabel 约束和文本字段约束。constraints.weighty = 1;constraints.anchor = GridBagConstraints.NORTHWEST;

编辑:

来自Oracle的GridBagLayout指南

数字越大,表示组件的行或列应获得更多空间。对于每列,权重与为该列中的组件指定的最高权重x相关,每个多列组件的权重以某种方式在组件所在的列之间分配。同样,每行的权重与为该行中的组件指定的最高权重相关。额外的空间倾向于朝向最右边的列和最下面的行。


答案 2

您需要在 Swing 教程中进一步阅读有关其所在位置的部分:weightX/weightY

除非至少为 weightx 或 weighty 指定一个非零值,否则所有组件都会聚集在其容器的中心。

您指定了权重X,但未指定权重Y。

编辑,它比我想象的要复杂。看来您还需要指定:

constraints.anchor = GridBagConstraints.FIRST_LINE_START;

对于两个组件在加法中加成重量。


推荐