ウィンドウを表示する前にタイトルバーの高さを取得する方法

JavaのJFrameでウィンドウを作成し、そのウィンドウの高さに応じてウィンドウ内に描画する処理を変更したいという状況がありました。

ただし、Jframeでのウィンドウの高さというのはタイトルバーの高さも含まれているため、タイトルバーの高さを除いた描画領域を取得したい。
つまりタイトルバーの高さを取得できればいいわけです。

過去にここらへんのつまづきポイント&タイトルバーの高さの取得方法を記事にしていたので、それを参考にしました。
【Java】JFrameのサイズにはタイトルバーや枠線も含まれている!

しかし、なぜかgetInsets().topの値が0になっている。
もちろんタイトルバーは表示されています。昔やったときはタイトルバーの高さが22とかだった気がする・・・。
とにかくタイトルバーが表示されているのにgetInsets().topの値が0はおかしい。

そこで色々と調べてみると、getInsets()の値はウィンドウを表示可能な状態にしてからでないとセットされないとのこと。

frame.pack()か、frame.addNotify()をgetInsets()よりも前に実行すると、解決しました。


public class Main extends JFrame {
  public Main(){
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setTitle("Network Layout");
    this.add(new UIDraw(), BorderLayout.CENTER);
    this.addNotify();  //ウィンドウを表示可能な状態にする
    System.out.println(this.getInsets());  //=> [top=22,left=0,bottom=0,right=0]
    this.setPreferredSize(new Dimension(width, height + this.getInsets().top)); //タイトルバーを除いた描画領域を(width, height)の大きさに設定
    this.pack();
    this.setVisible(true);
  }
}

コメント