【问题标题】:Leave small space between buttons when using GridLayout使用 GridLayout 时在按钮之间留出小空间
【发布时间】:2014-10-28 15:15:58
【问题描述】:

我正在尝试创建一个工具栏,它将位于我的 java swing 应用程序中所有页面的顶部。

我正在创建一个 JPanel,其中包含一系列单独的 JPanel(容器)。每个 JPanel(容器)都有一个南北组件,或者只是一个北组件,使用 GridLayout 设置。

我的问题是,我想在南北组件之间留一个小间隙,但我看不到怎么做,也无法在互联网上找到任何帮助。

以下是其中一个容器的代码的工作示例:

public static void CustomersGui(){

        final JFrame frame = new JFrame("Nested Layout Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel container1 = new JPanel();
        container1.setLayout(new GridLayout(2,1));
        JButton buttonDiary = new JButton("Diary");
        buttonDiary.setPreferredSize(new Dimension(140, 25));
        JButton buttonCars = new JButton("Cars");
        buttonCars.setPreferredSize(new Dimension(140, 25));
        container1.add(buttonDiary, BorderLayout.NORTH);
        container1.add(buttonCars, BorderLayout.SOUTH);


        frame.setContentPane(container1);

        frame.pack();


        frame.setVisible(true);
    }

【问题讨论】:

  • 请注意,GridLayout 有一个构造函数,它还允许您指定“hgap”和“vgap”:组件之间的水平和垂直间隙大小。或者,将BorderFactory.createEmptyBorder(1,2,3,4) 分配给 inner 组件是添加空格的一种可能方式(但只有在没有适当的布局选项来实现所需目标时才应使用)
  • 请查看providing whitespace, in a Swing GUI。希望这会有所帮助:-)
  • 此外,您可以将Border 与任何 Swing 组件一起使用 :-)

标签: java swing user-interface gridbaglayout jtoolbar


【解决方案1】:

我正在尝试创建一个工具栏,它将位于我的 java swing 应用程序中所有页面的顶部。

为什么不直接使用JToolBar?见How to use Tool Bars

我正在创建一个 JPanel,其中包含一系列单独的 JPanel(容器)。每个JPanel(容器)都有一个南北 组件或只是一个北组件,使用 GridBagLayout 设置。

根据您的代码,这些陈述都不正确:您正在添加按钮(不是面板)并且您使用的是GridLayout 而不是GridBagLayout

JPanel container1 = new JPanel();
container1.setLayout(new GridLayout(2,1)); // GridLayout
JButton buttonDiary = new JButton("Diary"); // button here
buttonDiary.setPreferredSize(new Dimension(140, 25));
JButton buttonCars = new JButton("Cars"); // another button here

除了您使用BorderLayout 约束之外,GridLayoutGridBagLayout 将完全忽略这些约束:

container1.add(buttonDiary, BorderLayout.NORTH);
container1.add(buttonCars, BorderLayout.SOUTH);

您应该查看整个 Laying Out Components Within a Container 课程以了解布局管理器以及它们是如何工作的。

另外

正如@nIcEcOw 明智地指出的那样,从 Java 1.4 BorderLayout 开始,强烈建议使用新常量:

PAGE_START
PAGE_END
LINE_START
LINE_END
CENTER

来自How to Use BorderLayout教程(我的粗体字):

在 JDK 1.4 版之前,各个领域的首选名称是 不同,范围从指南针的点(例如, BorderLayout.NORTH 用于顶部区域)到更冗长的版本 我们在示例中使用的常量。 我们的示例使用的常量是 首选,因为它们是标准的并且使程序能够适应 具有不同方向的语言。

更新

现在您的问题已被编辑为说您实际上使用了GridLayout,很容易回答说您可以通过使用类的构造函数来指定组件之间的水平和垂直间隙:或setHgap() 和@987654338 @方法:

JPanel container1 = new JPanel(new GridLayout(2, 1, 8, 8));

// Or

GridLayout gridLayout = new GridLayout();
gridLayout.setRows(2);
gridLayout.setColumns(1);
gridLayout.setHgap(8);
gridLayout.setVgap(8);    
JPanel container1 = new JPanel(gridLayout);

container1 面板添加按钮时不要忘记删除BorderLayout 约束,因为它们将被忽略:

container1.add(buttonDiary);
container1.add(buttonCars);

您可能也想看看这个主题:Providing white space in a Swing GUI

【讨论】:

  • 请尝试将BorderLayout.PAGE_STARTBorderLayout.PAGE_END 分别用于BorderLayout.NORTHBorderLayout.SOUTH。自 JDK 1.4 以来,Java 积极鼓励程序员编写新名称而不是以前的名称 :-)
  • @dic19 如果您正确阅读了这个问题,您会看到它说这是其中一个容器的代码的工作示例。代码经过编辑以符合 MCVE 原则
  • 感谢您指出@nIcEcOw 坏习惯很难改掉。我刚刚编辑了我的答案以包含您的评论:D
  • Emmm... 它最小且完整,但不可验证:它不会重现您的问题。至少问题中所述的问题:在使用 GridBagLayout 时在按钮之间留出小空间。 @吉姆
  • @dic19,你说得对,我现在编辑说 GridLayout。你的第一次批评是不正确的,但第二次是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2019-11-28
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多