【问题标题】:Why has this JPanel always a top-gap?为什么这个 JPanel 总是一个顶级差距?
【发布时间】:2022-01-22 02:36:45
【问题描述】:

我创建了一个带有 BorderLayout 的 JFrame,东边有一个面板(蓝色),中间有一个面板(绿色。中心面板包含一个橙色面板,它始终保持正方形。

我只是无法弄清楚为什么有机面板总是在顶部有一个间隙(在调整大小之后也是如此),因为我根本没有设置任何间隙。 This is how it looks 这就是我尝试过的:

    public class Main {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setMinimumSize(new Dimension(600+200, 600));
        frame.setLocationByPlatform(true);
        BorderLayout borderLayout = new BorderLayout();
        frame.setLayout(borderLayout);
        
        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(Color.BLUE);
        rightPanel.setPreferredSize(new Dimension(200, 600));
        frame.add(rightPanel, BorderLayout.EAST);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.GREEN);

        SquarePanel squarePanel = new SquarePanel();
        squarePanel.setBackground(Color.ORANGE);
        centerPanel.add(squarePanel);

        frame.add(centerPanel, BorderLayout.CENTER);
        frame.setVisible(true);
    }
}


    public class SquarePanel extends JPanel {
    @Override
    public Dimension getPreferredSize() {
        Dimension d;
        Container c = getParent();
        if (c != null) {
            d = c.getSize();
        } else {
            return new Dimension(10, 10);
        }
        int w = (int) d.getWidth();
        int h = (int) d.getHeight();
        int s = (w < h ? w : h);
        if(s%8 != 0){       // make Dimensions stay multiples of 8
            s = s - s%8;
        }
        return new Dimension(s, s);
    }
}

很遗憾,boarderLayout.setVGap(0) 不起作用。

【问题讨论】:

  • 您应该在添加组件之后和设置可见之前在 JFrame 上调用 pack()。而且您不应该为框架设置尺寸或任何尺寸提示。让 JFrame 自己调整大小。
  • 但是橙色面板的大小必须是 8 的倍数,因为它实际上是一个棋盘,或者你的意思是别的什么
  • 这与设置 JFrame 的大小或大小提示有什么关系?同样,让 JFrame 自行调整大小。布局管理器和组件会告诉它如何正确调整大小。
  • 你说的我试过了,但是差距还在
  • “棋盘” 对于“无间隙”(除非用作空白)棋盘,请参阅this example

标签: java swing layout jpanel


【解决方案1】:

因为如果你不给centerPanel 布局,我相信默认布局是FlowLayout。 FlowLayout 会自动在元素周围创建填充。你需要给 centerPanel 一个像centerPanel.setLayout(new BorderLayout()); 这样的边框布局。面板不继承其父级的布局。

或者,您可以尝试更改 FlowLayout 的填充,例如这里 Java FlowLayout - Margin/padding of specific elements?

【讨论】:

  • 默认布局是FlowLayout,默认FlowLayout有5个像素的水平间距和垂直间距。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多