另一个GridBagLayout对齐方式

问题描述 投票:-1回答:3

我在这里读到了很多关于这个问题的信息。但是我似乎并没有找到解决这个问题的方法。我尝试过的所有解决方案均无效。

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

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

请查看我的代码:

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的锚点。它在那里....但是不起作用。它在面板中间完美对齐。

如果有关系:Panel用作SplitPane的LeftComponent:

public LeftMenu leftpanel = new LeftMenu(); 

splitPaneTrunks.setLeftComponent(leftpanel);

期待您的帮助。

这里是我的侧菜单的图片...水平居中。不应该的。

http://i.stack.imgur.com/NsBg2.png

java swing layout-manager gridbaglayout
3个回答
1
投票

代替使用GridBagLayout,您可以使用布局为JPanelBorderLayout进行换行,如下所示:

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

1
投票

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

我想您的意思是,如果要从顶部显示组件,则不应垂直居中。

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

阅读有关How to Use GridBagLayout的Swing教程中的部分。有一个关于weightx / weighty约束的部分将对此进行更详细的说明。


0
投票

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

我建议使用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。工作十到十五分钟。

截屏:

MigLayout example screenshot

© www.soinside.com 2019 - 2024. All rights reserved.