web-dev-qa-db-ja.com

JFrame:ボーダーなしのサイズを取得しますか?

Javaでは、タイトルやその他の境界線なしでJFrameの幅と高さを取得できますか?

frame.getWidth()およびframe.getHeight()1は、ボーダーを含む幅を返すようです。

ありがとう。

26
Tom

frame.getContentPane().getSize();
35
user489041
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()));
7
dwarfer88

これはうまくいきます

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
Gary

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