JFrame:获得没有边框的大小?

在Java中,是否可以获得没有标题和其他边框的JFrame的宽度和高度?

frame.getWidth()和frame.getHeight()1似乎返回包括边框的宽度。

谢谢。

frame.getContentPane().getSize(); 
 frame.pack(); System.out.println("frame width : "+getWidth()); System.out.println("frame height: "+getHeight()); System.out.println("content pane width : "+getContentPane().getWidth()); System.out.println("content pane height: "+getContentPane().getHeight()); System.out.println("width of left + right borders: "+(getWidth()-getContentPane ().getWidth())); System.out.println("height of top + bottom borders: "+(getHeight()-getContentPane().getHeight())); 

这很好用

 frame.getContentPane().getSize(); 

但如果你还没有添加内容,那就不行了。 就我而言,我想在添加内容之前计算JFrame的内部维度,因此我可以相应地划分内容。 这就是我想出的。

 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); pack(); // Need this, otherwise insets() show as 0. int scrW = (int)screenSize.getWidth(); int scrH = (int)screenSize.getHeight(); int innerW = scrW - getInsets().left - getInsets().right; int innerH = scrH - getInsets().top - getInsets().bottom; // Need to setSize(), otherwise pack() will collapse the empty JFrame setSize(scrW, scrH); 

这是一个代码片段,它适用于JFrame以及AWT的Frame (恰好是JFrame的超类型):

 public static Dimension getInnerSize(Frame frame) { Dimension size = frame.getSize(); Insets insets = frame.getInsets(); if (insets != null) { size.height -= insets.top + insets.bottom; size.width -= insets.left + insets.right; } return size; } 

注意:插入只有在显示框架后才有效。

这是解决此问题的另一个代码段:

 private static Insets defaultInsets; public static Insets getInsetsWithDefault(Frame frame) { // insets only correct after pack() and setVisible(true) has been // called, so we use some fallback strategies Insets insets = frame.getInsets(); if (insets.top == 0) { insets = defaultInsets; if (insets == null) { insets = new Insets(26, 3, 3, 3); // usual values for windows as our last resort // but only as long as we never saw any real insets } } else if (defaultInsets == null) { defaultInsets = (Insets) insets.clone(); } return insets; } 

需要使用可见帧调用此代码一次。 之后,即使对于不可见的帧,它也可以正确地预测插入(由于defaultInsets缓存),假设它们总是相同的。

当然,这仅适用于所有窗口都具有相同的窗口装饰。 但我不知道他们可能因窗口而异。

这也可能有用:

 frame.addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { MyUtilClass.getInsetsWithDefault(frame); // init the defaultInsets } }); 

一旦窗口可见,它将调用getInsetsWithDefault()方法并初始化正确的defaultInsets