如何删除JPanel中仍然使用流布局之间的填充?

2022-09-04 19:19:32

这是我的java应用程序GUI中我有疑问的部分。

enter image description here

这个GUI包含的是一个蓝色的JPanel(容器),默认的FlowLayout作为布局管理器,其中包含一个包含两个JPanel的盒子(删除水平间距,或者我可以使用setHgaps为零而不是一个盒子),每个JLabel都包含一个JLabel。

下面是我用于创建 GUI 的该部分的代码。

  private void setupSouth() {

    final JPanel southPanel = new JPanel();
    southPanel.setBackground(Color.BLUE);

    final JPanel innerPanel1 = new JPanel();
    innerPanel1.setBackground(Color.ORANGE);
    innerPanel1.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
    innerPanel1.add(new JLabel("Good"));

    final JPanel innerPanel2 = new JPanel();
    innerPanel2.setBackground(Color.RED);
    innerPanel2.setPreferredSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT));
    innerPanel2.add(new JLabel("Luck!"));

   final Box southBox = new Box(BoxLayout.LINE_AXIS);
  southBox.add(innerPanel1);
  southBox.add(innerPanel2);

    myFrame.add(southPanel, BorderLayout.SOUTH);
}

我的问题是,我该如何摆脱外部JPanel(蓝色)和Box之间的垂直填充?

我知道这是填充,因为我读到了边距和填充之间的差异?“填充=从文本到边框的元素周围的(内部)空间”。

这不起作用,因为这必须归因于组件之间的间隙(空间).- 如何在MigLayout中删除JPanel填充?

我试过这个,但它也不起作用。Java 中的 JPanel Padding


答案 1

您可以只设置 中的间隙,即FlowLayout

FlowLayout layout = (FlowLayout)southPanel.getLayout();
layout.setVgap(0);

默认值具有 5 个单位的水平和垂直间隙。在这种情况下,水平无关紧要,因为 正在水平拉伸面板。FlowLayoutBorderLayout

或者简单地使用新的初始化面板。这将是相同的结果。FlowLayout

new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));

编辑:

“我试过了,没有用。.”

为我工作...

enter image description here     enter image description here

设置间隙 ↑ 不设置间隙 ↑

import java.awt.*;
import javax.swing.*;

public class Test {

    public void init() {
        final JPanel southPanel = new JPanel();
        FlowLayout layout = (FlowLayout)southPanel.getLayout();
        layout.setVgap(0);
        southPanel.setBackground(Color.BLUE);

        final JPanel innerPanel1 = new JPanel();
        innerPanel1.setBackground(Color.ORANGE);
        innerPanel1.add(new JLabel("Good"));

        final JPanel innerPanel2 = new JPanel();
        innerPanel2.setBackground(Color.RED);
        innerPanel2.add(new JLabel("Luck!"));

        final Box southBox = new Box(BoxLayout.LINE_AXIS);
        southBox.add(innerPanel1);
        southBox.add(innerPanel2);

        southPanel.add(southBox);   // <=== You're also missing this

        JFrame myFrame = new JFrame();
        JPanel center = new JPanel();
        center.setBackground(Color.yellow);
        myFrame.add(center);
        myFrame.add(southPanel, BorderLayout.SOUTH);
        myFrame.setSize(150, 100);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.setLocationByPlatform(true);
        myFrame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new Test().init();
            }
        });
    }
}

注意:始终发布一个可运行的示例(就像我所做的那样)以获得更好的帮助。你说它不起作用,但它总是对我有用,那么如果没有一些代码来运行并演示问题,我们怎么知道你做错了什么呢?


答案 2

推荐