【问题标题】:Setting component sizes inside Jpanels with Borderlayout使用 Borderlayout 在 Jpanels 中设置组件大小
【发布时间】:2019-03-15 12:33:37
【问题描述】:

我有一个复制谷歌登录 GUI here 的项目。到目前为止,我仍在寻找我要开始的内容,但经过一些研究,我认为 BorderLayout 可以做到这一点。我通过边界重新调整所有内容来了解​​它的工作原理,我有点喜欢它,因为与空布局和为每个组件的每个 setBounds 编码相比,它的响应速度非常快。

我一直在想象使用一个背景面板,一个用于填写表格的面板, 并为每对标签和文本字段创建面板以正确创建空间并将它们堆叠(或嵌套)在另一个之上。我们的老师刚刚告诉我们剪掉图像,她只是想我们是否知道如何从头开始设计一些东西。那并将输入保存到文本文件中。

但是,我似乎无法理解增加边框内的组件大小以模仿文本字段之间的间隙的概念,例如组件之间的某种填充?使用 setSize 不起作用,到目前为止,我的搜索只导致调整边框大小,或者我仍然没有输入正确的可搜索词?

另外,我一直在寻找另一种方式,我认为这个项目也可以使用 GridBaglayout。但是很多人说 GridBagLayout 太复杂了。你认为怎样做会更容易?

【问题讨论】:

  • 仅基于意见,但我更喜欢GridBagLayout。使用其Insets 管理差距。
  • 嗯,我看到插图是在一个对象上制作的。因此,如果一个组件不应该遵循已经声明的内容,这是否意味着我需要创建另一个组件?例如,下一步按钮似乎比其他填充有更远的距离。这意味着这个新的 inset 对象必须适应另一个的变化,或者 API 中有这样的东西来处理这种情况?
  • @inNeedOfHelp 附带说明:检查docs.oracle.com/javase/tutorial/uiswing/layout/visual.html 以获得不同基本布局管理器的基本可视化。另请注意,您可以将面板放置在其他面板中,并且每个面板都有一个布局管理器,这可能与其他面板不同。

标签: java swing layout-manager


【解决方案1】:

根据我的经验,几乎所有 (99%) 使用 GridBagLayout 的面板都可以使用所有其他布局进行设计。所以,有人会说GridBagLayout 是可选的

在您的情况下,避免使用GridBagLayout 很容易。看看下面的代码:

public class NoGridBagLayout extends JFrame {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new NoGridBagLayout().setVisible(true));
    }

    public NoGridBagLayout() {
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setExtendedState(MAXIMIZED_BOTH);

        JPanel borderPanel = new JPanel(new BorderLayout());
        borderPanel.setBorder(new TitledBorder("borderPanel - BorderLayout"));
        JLabel label = new JLabel("Create a google account.");
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setFont(label.getFont().deriveFont(25f));
        borderPanel.add(label, BorderLayout.PAGE_START);
        setContentPane(borderPanel);

        JPanel gridPanel = new JPanel(new GridLayout(1, 2));
        gridPanel.setBorder(new TitledBorder("gridPanel - GridLayout"));
        getContentPane().add(gridPanel, BorderLayout.CENTER);

        JPanel leftBoxedPanel = new JPanel(); // Fill it with panels using BoxLayout.X_AXIS
        leftBoxedPanel.setLayout(new BoxLayout(leftBoxedPanel, BoxLayout.Y_AXIS));
        leftBoxedPanel.setBorder(new TitledBorder("leftBoxedPanel - BoxLayout.Y_AXIS"));
        gridPanel.add(leftBoxedPanel);

        JPanel rightBoxedPanel = new JPanel(); // Fill it with panels using BoxLayout.X_AXIS
        rightBoxedPanel.setLayout(new BoxLayout(rightBoxedPanel, BoxLayout.Y_AXIS));
        rightBoxedPanel.setBorder(new TitledBorder("rightBoxedPanel - BoxLayout.Y_AXIS"));
        gridPanel.add(rightBoxedPanel);
    }
}

预览:

【讨论】:

  • 哇,这是一个干净的!我想我已经决定切换到 GridBagLayout 来创建表单本身,并将 BorderLayouts 放在外部放置的东西上。
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2021-02-02
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多