我注意到秋千中容器之间的奇怪行为。为什么JFrame的大小超过其ContentPane的大小,即使它具有定义的大小?
为了举例说明测试,我创建了一个JFrame和一个JPanel,并将面板设置为contentPane。我将首选和最大JPanel大小定义为400,300。所有这一切都可以看出,在下面的例子:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ExcessiveSpacePanelTest {
JFrame frame;
JPanel panel;
public void initGUI(){
frame = new JFrame();
panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
panel.setPreferredSize(new Dimension(400, 300));
panel.setMaximumSize(new Dimension(400, 300));
frame.setContentPane(panel);
frame.pack();
System.out.println("panel size: [" + panel.getSize().width + "," + panel.getSize().height +"]");
System.out.println("frame size: [" + frame.getSize().width + "," + frame.getSize().height+"]");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(() ->{
new ExcessiveSpacePanelTest().initGUI();
});
}
}
结果是:
令我惊讶的,在终端的输出是:
面板尺寸: [400,300]
frame size:[416,338]
我不明白为什么框架增加了这个额外的空间,即使组件中没有任何内容强制框架调整大小。
我试图通过在pack();
之前添加行panel.setBorder (BorderFactory.createEmptyBorder(0, 0, 0, 0));
来在面板上设置归零边缘,但结果仍然相同。
这样做的问题是java给我一个错误的信息,因为面板在缩放帧的大小,并且从上面的结果中,我们看到两者的大小不一样。
这两项措施是否正确报告?为什么会发生?
也许,这可能会有所帮助:http://stackoverflow.com/a/11939203/6776262 – quackenator
感谢@quackenator。但我也想知道为什么这个额外空间只包含一个固定尺寸的空面板。 – Articuno
JFrame包含外部边框和标题栏。你可以尝试'frame.getContentPane()。getSize();'获取内容窗格的大小。 – quackenator