2017-05-10 55 views
2

我注意到秋千中容器之间的奇怪行为。为什么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(); 
     }); 
    } 
} 

结果是:

inserir a descrição da imagem aqui

令我惊讶的,在终端的输出是:

面板尺寸: [400,300]
frame size:[416,338]

我不明白为什么框架增加了这个额外的空间,即使组件中没有任何内容强制框架调整大小。

我试图通过在pack();之前添加行panel.setBorder (BorderFactory.createEmptyBorder(0, 0, 0, 0));来在面板上设置归零边缘,但结果仍然相同。

这样做的问题是java给我一个错误的信息,因为面板在缩放帧的大小,并且从上面的结果中,我们看到两者的大小不一样。

这两项措施是否正确报告?为什么会发生?

+1

也许,这可能会有所帮助:http://stackoverflow.com/a/11939203/6776262 – quackenator

+0

感谢@quackenator。但我也想知道为什么这个额外空间只包含一个固定尺寸的空面板。 – Articuno

+3

JFrame包含外部边框和标题栏。你可以尝试'frame.getContentPane()。getSize();'获取内容窗格的大小。 – quackenator

回答

2

您可能会发现在不同平台上比较类似程序的结果会有所帮助。特别是,

  • 红色Border内部面板;您的使用符合API recommendation,“我们建议您将组件放在JPanel中,并将边框设置为JPanel。”

  • 框架宽度与Mac OS X上的面板宽度相匹配,因为用于top-level container的重量级对象在Mac OS X上没有垂直边框; Windows对等体有它自己的边界。

  • 框高包括拖动条和框架边框:38个像素的寡妇,22在Mac OS X

  • 不要使用setPreferredSize()当你真的要覆盖getPreferredSize()

  • 另外,框架的add()方法转发到内容窗格。

panel size: [400,300] 
frame size: [400,322] 

image

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() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(400, 300); 
      } 
     }; 
     panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1)); 
     frame.add(panel); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 

     System.out.println("panel size: [" + panel.getSize().width + "," + panel.getSize().height +"]"); 
     System.out.println("frame size: [" + frame.getSize().width + "," + frame.getSize().height+"]"); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() ->{ 
      new ExcessiveSpacePanelTest().initGUI(); 
     }); 
    } 
} 
+1

谢谢,这澄清了疑问。 – Articuno

相关问题