所以我设置了setSize(500,500)..添加一些面板,面板的总和Y是500,就像JFrame一样,但是执行它显示的计数Y是525 am我错过了什么?
JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel);
//--------------------
JPanel top_panel = new JPanel();
top_panel.setLayout(null);
top_panel.setBackground(Color.blue);
top_panel.setBounds(0, 0, 500, 40);
panel.add(top_panel);
//------------------------------
JPanel middle_panel = new JPanel();
middle_panel.setLayout(null);
middle_panel.setBackground(Color.yellow);
middle_panel.setBounds(0, 40, 500, 385);
panel.add(middle_panel);
//-----------------------------
JPanel bottom_panel = new JPanel();
bottom_panel.setLayout(null);
bottom_panel.setBackground(Color.black);
bottom_panel.setBounds(0, 425, 500, 75);
panel.add(bottom_panel);
setSize(500,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
40 + 385 + 75 = 500但要显示我必须
的所有面板setSize(500,525);
然后它适合
这是一张图片:
答案 0 :(得分:3)
框架大小是包括标题栏在内的浅蓝色矩形。您的面板出现在内部边界中,框架大小小于框架边框和框架标题栏。您是否看到底部标记的空间与标题栏的高度奇怪相同?
将面板/组件添加到框架中并在调用frame.setVisible(true)之前,调用frame.pack()。
如果您拥抱布局管理器(例如FlowLayout)并在必要时调用setPreferredSize并让布局管理器执行布局,那也更为可取。通常可以通过setBound,setSize,setMininumSize,setMaximumSize调用setPreferredSize。
import javax.swing.*;
import java.awt.*;
public class FrameSize {
private JFrame frame;
FrameSize create() {
frame = createFrame();
frame.getContentPane().add(createContent());
return this;
}
private JFrame createFrame() {
JFrame frame = new JFrame(getClass().getName());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
return frame;
}
void show() {
// frame.setSize(500, 500);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
}
private Component createContent() {
JPanel panel = new JPanel(null);
JPanel topPanel = new JPanel(null);
topPanel.setBackground(Color.blue);
topPanel.setBounds(0, 0, 500, 40);
panel.add(topPanel);
JPanel middlePanel = new JPanel(null);
middlePanel.setBackground(Color.yellow);
middlePanel.setBounds(0, 40, 500, 385);
panel.add(middlePanel);
JPanel bottomPanel = new JPanel(null);
bottomPanel.setBackground(Color.black);
bottomPanel.setBounds(0, 425, 500, 75);
panel.add(bottomPanel);
panel.setPreferredSize(new Dimension(500, topPanel.getBounds().height + middlePanel.getBounds().height + bottomPanel.getBounds().height));
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new FrameSize().create().show();
}
});
}
}
答案 1 :(得分:3)
您不应该设置尺寸或致电setSize(...)
或setBounds(...)
,以便将来为类似的问题做好准备,或者当您尝试展示自己时出现更严重的问题GUI在不同的平台上。而是让您的组件的首选大小和布局管理器为您工作。如果您绝对必须设置组件的大小,请覆盖getPreferredSize()
并返回一个计算适合您的维度。是的,根据javajon,您应该在显示它之前在JFrame上调用pack()
。
有关null布局的更多讨论,请阅读本网站上最好的Swing专家之一,MadProgrammer,在他的回答here中说。