在Java中,是否可以获取JFrame的宽度和高度,但不包括标题栏和其他边框?
frame.getWidth()和frame.getHeight()似乎返回了包括边框在内的宽度。
谢谢。
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;
}
这段代码需要在可见框架内调用一次。之后,即使是不可见的框架(由于默认插图的缓存),它也能正确预测插图,假设它们始终相同。
当然,这仅适用于所有窗口使用相同的窗口装饰的情况。但我不知道有任何窗口装饰可能会从窗口到窗口不同的情况。
这也可能很有用:
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
MyUtilClass.getInsetsWithDefault(frame); // init the defaultInsets
}
});
一旦窗口可见,它将调用getInsetsWithDefault()
方法并初始化正确的defaultInsets
。