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
を初期化します。