JFrame:如何获取不带边框的大小?

28

在Java中,是否可以获取JFrame的宽度和高度,但不包括标题栏和其他边框?

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

谢谢。

4个回答

39

frame.getContentPane().getSize();


5
感谢您的信任!在执行该命令之前,应先运行frame.pack();。否则,它将返回(0; 0),请知悉。 - rzaaeeff

7
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()));

5
这个很好用。
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);

3

这里是一个代码片段,适用于 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;
}

这段代码需要在可见框架内调用一次。之后,即使是不可见的框架(由于默认插图的缓存),它也能正确预测插图,假设它们始终相同。

当然,这仅适用于所有窗口使用相同的窗口装饰的情况。但我不知道有任何窗口装饰可能会从窗口到窗口不同的情况。

这也可能很有用:

frame.addWindowListener(new WindowAdapter() {

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

});

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


似乎您不需要显示框架即可获取插入;您只需将框架打包(pack())即可。 - Para Parasolian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接