为什么此 JPanel 始终处于领先地位?
Why has this JPanel always a top-gap?
我创建了一个带有 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) 不起作用。
因为如果您不给 centerPanel
布局,我相信默认布局是 FlowLayout
。 FlowLayout 会自动在元素周围创建填充。您需要为 centerPanel 提供这样的边框布局 centerPanel.setLayout(new BorderLayout());
。面板不继承其父级的布局。
或者您可以尝试像这里 Java FlowLayout - Margin/padding of specific elements?
那样更改 FlowLayout
的填充
我创建了一个带有 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) 不起作用。
因为如果您不给 centerPanel
布局,我相信默认布局是 FlowLayout
。 FlowLayout 会自动在元素周围创建填充。您需要为 centerPanel 提供这样的边框布局 centerPanel.setLayout(new BorderLayout());
。面板不继承其父级的布局。
或者您可以尝试像这里 Java FlowLayout - Margin/padding of specific elements?
那样更改FlowLayout
的填充