另一个 GridBagLayout 对齐

Another GridBagLayout Alignment

我在这里读了很多关于这个问题的文章...但我似乎不知道如何解决这个问题。 我尝试的所有解决方案均无效。

但让我们从头开始: 我正在使用 Swing 构建我的界面并尝试模块化。 所以我的左主菜单有一个 class(扩展 JPanel)。 菜单是用 GridBagLayout 中的几个按钮构建的。

但我无法使此布局与 window(面板)的顶部对齐。 示例:面板顶部的标签、下方的文本字段、文本字段下方的按钮等

请看我的代码:

public class LeftMenu extends JPanel {
  public LeftMenu(){

    GridBagLayout gbl_panel = new GridBagLayout();
    gbl_panel.columnWidths = new int[] { 86, 0 };
    gbl_panel.rowHeights = new int[] {32, 32, 32, 32, 32, 32, 32, 32, 32 };
    gbl_panel.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
    gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0 };
    setLayout(gbl_panel);

    JLabel lblEnterTrunkId = new JLabel("Enter Trunk ID");
    GridBagConstraints gbc_lblEnterTrunkId = new GridBagConstraints();
    gbc_lblEnterTrunkId.fill = GridBagConstraints.HORIZONTAL;
    gbc_lblEnterTrunkId.insets = new Insets(0, 0, 5, 0);
    gbc_lblEnterTrunkId.gridx = 0;
    gbc_lblEnterTrunkId.gridy = 0;
    gbc_lblEnterTrunkId.anchor = GridBagConstraints.NORTH;
    add(lblEnterTrunkId, gbc_lblEnterTrunkId);
    }
 }

标签后面有一个文本字段和一些按钮。 但我认为,这些是不相关的...... 如果它们是……它们大多看起来像标签(只是它们不是标签……我想你明白我的意思了)

我阅读的所有指南都指向 GridBagConstraint 的锚点。它在那里....但不工作。 它在面板中间完美对齐。

如果重要的话: 用作 SplitPane 的 LeftComponent 的面板列表:

public LeftMenu leftpanel = new LeftMenu(); 

splitPaneTrunks.setLeftComponent(leftpanel);

期待您的帮助。

这是我的侧边菜单的图片...水平居中。因为它不应该。

除了使用 GridBagLayout,您还可以使用布局 BorderLayoutJPanel 进行包装,如下所示:

    setLayout(new BorderLayout());

    JPanel gridBagWrap = new JPanel();

    GridBagLayout gbl_panel = new GridBagLayout();
    gbl_panel.columnWidths = new int[] { 86, 0 };
    gbl_panel.rowHeights = new int[] {32, 32, 32, 32, 32, 32, 32, 32, 32 };
    gbl_panel.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
    gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0 };
    gridBagWrap.setLayout(gbl_panel);

    JLabel lblEnterTrunkId = new JLabel("Enter Trunk ID");
    GridBagConstraints gbc_lblEnterTrunkId = new GridBagConstraints();
    gbc_lblEnterTrunkId.fill = GridBagConstraints.HORIZONTAL;
    gbc_lblEnterTrunkId.insets = new Insets(0, 0, 5, 0);
    gbc_lblEnterTrunkId.gridx = 0;
    gbc_lblEnterTrunkId.gridy = 0;
    gbc_lblEnterTrunkId.anchor = GridBagConstraints.NORTH;
    gridBagWrap.add(lblEnterTrunkId, gbc_lblEnterTrunkId);

    add(gridBagWrap, BorderLayout.NORTH);

here is a picture of my side menu... centered horizontally. as it should not be.

我想你的意思是如果你想让组件从顶部显示,它不应该垂直居中。

无论如何,我认为问题出在您的 weighty 约束上。对于至少一个组件,它必须是非零的,否则组件将垂直居中。

阅读 How to Use GridBagLayout 上的 Swing 教程部分。关于 weightx/weighty 约束的部分将对此进行更详细的解释。

GridBagLayout 经理让您迷路也就不足为奇了。 它实际上是其最常提到的功能之一。 GridBagLayout 来自九十年代,在组件之间使用像素固定的间隙,这是不可移植的。使用此管理器,您必须繁琐地定义布局的每个单元格;难怪人们会感到困惑。

我推荐使用MigLayout。如果不能使用,则GroupLayout

这是 MigLayout 的解决方案:

package com.zetcode;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;

/*
Demonstration of MigLayout manager.
Author: Jan Bodnar
Website: zetcode.com
 */
public class MigLayoutTrunkEx extends JFrame {

    public MigLayoutTrunkEx() {

        initUI();
    }

    private void initUI() {

        JLabel lbl = new JLabel("Enter Trunk ID");
        JTextField textField = new JTextField(10);

        JButton btn1 = new JButton("A");
        JButton btn2 = new JButton("B");
        JButton btn3 = new JButton("C");
        JButton btn4 = new JButton("D");
        JButton btn5 = new JButton("E");

        JTextArea area = new JTextArea(20, 25);
        area.setBorder(BorderFactory.createEtchedBorder());

        JLabel statusBar = new JLabel("Ready");

        createLayout(lbl, textField, btn1, btn2, btn3,
                btn4, btn5, area, statusBar);

        setTitle("MigLayout example");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        setLayout(new MigLayout("", "[align center]", ""));

        add(arg[0], "split 7, flowy");
        add(arg[1]);
        add(arg[2]);
        add(arg[3]);
        add(arg[4]);
        add(arg[5]);
        add(arg[6]);
        add(arg[7], "grow, push, wrap");
        add(arg[8], "align left, growx, spanx");

        pack();
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            MigLayoutTrunkEx ex = new MigLayoutTrunkEx();
            ex.setVisible(true);
        });
    }
}

这很容易,一旦你了解了 MigLayout。十或十五分钟的工作。

截图: