【问题标题】:How to remove the padding between in the JPanel still using a flow layout?如何删除仍然使用流布局的 JPanel 之间的填充?
【发布时间】:2014-12-08 12:09:40
【问题描述】:

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

这个 GUI 包含的是一个蓝色的 JPanel(容器),默认 FlowLayout 作为 LayoutManager,其中包含一个包含两个 JPanel 的 Box(以删除水平间距,或者我可以使用 setHgaps 为零而不是 Box)每个都包含一个 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 之间的垂直填充?

我知道这是填充,因为我在 Difference between margin and padding? 上读到“填充 = 元素周围(内部)从文本到边框的空间。”

这行不通,因为这必须归因于组件之间的间隙(空间)。- How to remove JPanel padding in MigLayout?

我试过了,但也没有用。 JPanel Padding in Java

【问题讨论】:

  • 您的代码不完整。您永远不会将 southBox 添加到您的面板,也不会将您的 innerPanels 添加到您的南面板

标签: java swing jpanel padding layout-manager


【解决方案1】:

你可以只在set the gapsFlowLayout,即

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

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

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

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

编辑:

“我试过了,没用..”

为我工作...

   

     设置间距 ↑              不设置间距 ↑

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();
            }
        });
    }
}

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

【讨论】:

  • 我试过了,没用,因为组件之间有间隙
  • 请发布一个可运行的示例来演示此问题
  • 按照这个答案,您可以将super(new FlowLayout ( FlowLayout.CENTER, 0, 0 )); 放在您的 JPanel 类的顶部。这将删除您正在编程的类中按钮之间的填充。
猜你喜欢
  • 2023-03-25
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多