当前位置: 首页 > 知识库问答 >
问题:

GridBagLayout位于BoxLayout的中心,而不是顶部

楚钊
2023-03-14

下面的示例介绍了以下应用程序:

位于BorderLayout北边的按钮会将带有一些组件的GridBagLayout面板添加到BoxLayout中。Y_AXIS在BorderLayout中。CENTER。但是单击按钮后,面板会显示在中心,而不是添加到顶部。

public class Test extends JFrame {
    public Test() {
        super("Test");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

        JButton add = new JButton("Add");
        add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panel.add(new RecordPanel("text1", "text2"));
                panel.revalidate();
            }
        });

        Container container = getContentPane();
        container.add(add, BorderLayout.PAGE_START);
        container.add(panel, BorderLayout.CENTER);

        setSize(300, 500);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Test();
    }

    private class RecordPanel extends JPanel {
        private JRadioButton radioButton;
        private JLabel textLabel1;
        private JLabel textLabel2;

        public RecordPanel(String text1, String text2) {
            super();
            radioButton = new JRadioButton();
            textLabel1 = new JLabel(text1);
            textLabel2 = new JLabel(text2);
            initGUI();
        }

        private void initGUI() {
            setLayout(new GridBagLayout());
            GridBagConstraints constraints = new GridBagConstraints();

            constraints.gridx = 0;
            constraints.gridy = 0;
            add(radioButton, constraints);

            constraints.gridx = 1;
            constraints.gridy = 0;
            constraints.weightx = 1.0;
            constraints.fill = GridBagConstraints.HORIZONTAL;
            add(textLabel1, constraints);

            constraints.gridx = 1;
            constraints.gridy = 1;
            constraints.weightx = 1.0;
            constraints.fill = GridBagConstraints.HORIZONTAL;
            add(textLabel2, constraints);
        }
    }
}

播放锚(constraints.anchor=GridBagConstraints.FIRST_LINE_START)将单选按钮和一个标签设置到顶部,但第二个标签仍显示在中间。

如何让面板出现在顶部而不是中心?

共有3个答案

唐裕
2023-03-14

如果您不介意使用MigLayout而不是BoxLayout,这可能是您的解决方案:

首先,将面板布局更改为MigLayout:

panel.setLayout(new MigLayout("", "[]", "[]"));

为类创建一个静态变量,以计算新“RecordPanel”元素添加到的行:

public class Test extends JFrame {
    static int index = 0;

然后将添加到面板行中,以:

panel.add(new RecordPanel("text1", "text2"), "cell 0 " + index++);

这将把每个新的记录面板插入新行,因为索引总是递增的。

您可能希望将面板包装成滚动视图,以便在元素填充面板时添加滚动条。

葛昱
2023-03-14

元素GridBagConstraints.anchor是正确的选择,但是您必须使用其中一个值GridBagConstraint。NORTH到GridBagConstraint。NORTHWEST。

例如constraints.anchor=GridBagConstraint. NORTH

况浩邈
2023-03-14

问题是,最大大小默认定义为Integer。最大值xInteger。导致使用最大可用面积的新添加记录面板组件的最大值。此尺寸由BoxLayout观察。

您可以在类RecordPanel中重写getMaximumsize

@Override
public Dimension getMaximumSize() {
   return new Dimension(300, getPreferredSize().height);
}

留档有关于如何使用BoxLayout实现大小调整的详细信息。

 类似资料:
  • 我使用了StackPane,其中所有节点都在中心。现在我想有一个节点,它是一个HBox,这样我就可以在中心有水平元素。由于某种原因,HBox位于左上方,即使它是StackPane的节点。 这里是HBox的部分,我在这里添加了HBox:

  • 我希望我的解释足够好,有人能帮助我:-) 编辑:随着camickr的改进而更新,垂直尺寸问题得到解决。

  • 嗨,我是java初学者,正在使用GridBagLayout制作小型GUI。请参阅附带的代码和输出。我想要的是按照gridx和gridy中分配的位置将JButtons放置在左上角。但它把组件放在中心,而不是像预期的左上角,如果我使用插图,gridx/Gridy所有的工作,但不是从适当的坐标,所以请看附上的代码和图像,并指导我关于它 输出:想要左上角的按钮,请指点

  • 我有一个 我正在尝试对齐,所以所有的文本都是 但是,文本保留在 的顶部。 当我检查并查看计算值时,我没有看到任何会导致此问题的内容: 框-大小:边框-框 显示:块 浮动:右 高度:15px 行-高:15.7143 px 文本-对齐:左 垂直-对齐:中间 宽度:44px 包含的 具有以下内容: 框-大小:边框-框 显示:块 浮动:左 高度:28px 行-高:15.7143px 最小-高:1px 填充

  • 我想根据prestashop和wordpress变量是否被激活来更改databaseName变量的值。但我想在课堂上做这件事,我不知道它是否允许在那个地方使用“如果”。事实上,我在下面输入的代码给了我这个错误:“非法启动类型”。有可能解决这个问题吗?问候语。

  • 我希望所有新项目都添加到顶部,即,如果采用ROW-ID 1、2、3,我添加了一个新项目,则应将其添加到位置1,其余项目应移动。但现在当我添加一个项目时,它会被添加到ID 4(即后面)。 方法 _ _ _