【问题标题】:How make all components appear in center of the JPanel using GridBagLayout?如何使用 GridBagLayout 使所有组件出现在 JPanel 的中心?
【发布时间】:2015-08-01 19:36:07
【问题描述】:

我有以下代码。但我希望所有组件都出现在 JPanel 的中心。我已经为此花费了无数个小时,但每次都失败了。有人可以帮忙吗?

package tg.com.bugtracker;

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class LoginPanel extends JPanel {    
    LoginPanel() {
        GridBagLayout layout = new GridBagLayout();
        setLayout(layout);
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LAST_LINE_END;
        add(new JLabel("Username"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.LAST_LINE_START;
        JComboBox<String> combobox = new JComboBox<>();
        combobox.setPreferredSize(new Dimension(250, 20));
        add(combobox, constraints);
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.FIRST_LINE_END;
        add(new JLabel("Password"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.anchor = GridBagConstraints.FIRST_LINE_END;
        JTextField textfield = new JTextField();
        textfield.setPreferredSize(new Dimension(250, 20));
        add(textfield, constraints);
    }
}

【问题讨论】:

  • 所以布局不符合您的预期?它不显示在中心。代码对我来说看起来不错..
  • 将一组组件置于 GUI 区域中心的一种相当简单的方法是将它们布置在面板中并使用GridBagLayout 创建一个(或另一个)面板。然后将带有组件的面板作为一个没有约束的单个组件放入 GBL。任务完成!
  • 他们处于中心位置,但不是任何人所期望的。您知道任何应用程序的登录页面的外观吗?就在整个面板的中心!我迷路了。我正在尝试 setBounds(),看看是否有效。
  • 顺便说一句,当我创建该代码的MCVE(最小完整可验证示例)时,我将LoginPanel 的一个实例放入BorderLayoutCENTER 中,它肯定似乎是居中的。另请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是。)文本字段的大小可以通过列数和字体大小来建议。组合框将采用内容的大小,这归结为最宽的组合项和使用的渲染器。
  • “我正在尝试 setBounds(),我会看看它是否有效。” 把它从我这里拿走。它不会。或者即使它以默认大小在您的系统上工作,在调整大小后它也将无法工作,并且也可能在其他系统上失败(从一开始)。

标签: java swing jpanel layout-manager gridbaglayout


【解决方案1】:

将一组组件置于 GUI 区域中心的一种相当简单的方法是将它们布置在面板中并创建一个 (或其他)面板GridBagLayout。然后将带有组件的面板作为一个整体放入 GBL 没有约束的组件。大功告成!


顺便说一句,当我创建该代码的 MCVE(最小完整可验证示例)时,我删除了一个实例 LoginPanelCENTERBorderLayoutCENTER 似乎是居中的。

一般提示

Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?(是的。)

文本字段的大小可以通过列数和字体大小来建议。 组合框将采用内容的大小,这归结为最宽的组合项和使用的渲染器。

【讨论】:

【解决方案2】:

好的,首先我不太明白你的问题,我想你想把它们放在中间,但我不知道你为什么要使用锚。您使用的锚点将使对象出现在 Line End 或 Line Start 中,但您希望它们位于中心,因此您应该使用:

constraints.anchor = GridBagConstraints.CENTER; //BIG MOTHER OF GOD REDUNDANCE

这是一个冗余,因为anchor的默认值是Center,你不应该使用setBounds,我不知道你为什么要设置大小,网格将永远是最大对象的大小列。如果你想要做的是填充你应该使用的网格:

constraints.fill = GridBagConstraints.HORIZONTAL;

或垂直或两者都取决于您要填充它的方向。 因此,如果您想全部显示在中心这里是您的“更正代码”:

package tg.com.bugtracker;

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class LoginPanel extends JPanel {    
    LoginPanel() {
        GridBagLayout layout = new GridBagLayout();
        setLayout(layout);
        GridBagConstraints constraints = new GridBagConstraints(); 
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.anchor = GridBagConstraints.CENTER; //Redundance but I leaved it for you to see the change.
        add(new JLabel("Username"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 0;
        JComboBox<String> combobox = new JComboBox<>();
        combobox.setPreferredSize(new Dimension(250, 20));
        add(combobox, constraints);
        constraints.gridx = 0;
        constraints.gridy = 1;
        add(new JLabel("Password"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 1;
        JTextField textfield = new JTextField();
        textfield.setPreferredSize(new Dimension(250, 20));
        add(textfield, constraints);

    }
}

现在所有的对象都应该出现在中心,我推荐你this post 在 Stack Overflow 关于 GridBagLayout,它非常有趣,它有常见的错误,几乎涵盖了这个很棒的布局的所有内容。

【讨论】:

    猜你喜欢
    • 2013-06-10
    • 2013-07-24
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多