JavaのFrameは窓装飾を含む

 

こんにちは、イガジー@当サイト管理人です。

今日もJavaの知っておいた方が良いお話(Tips)。
Java で GUI ソフトを作る時に、Frameを使ったりしますが
このFrame のサイズには、窓(window)装飾のエリアも
含まれます。

窓(window)装飾というのは、タイトルバーや窓の縁取りの事です。
例えば、Frame で、setSize(200,100);などとした場合、
上部24dots(あるいは32dotsなど)には、
タイトルバー(含む閉じるボタンや最小化ボタン)が描画されますし
2〜4dotsは縁取りが描画されるので、自由に使えるエリア(面積)は
そのぶん減ります。

Frameに対して、グラフィック描画(getGraphics()して、drawLine()など)も可能ですが、
タイトルバーが描かれる部分に書いても反映されません。

窓装飾の面積はWindowManagerによって変わるので、
グラフィック描画をする場合は、CanvasをFrame内に置いて
そこに描くのが良いです。
同様に、setBoundsでボタンなどを座標指定して置く場合は、
PaneをFrame内に置いて、Panelに対してsetBoundsでボタン等を置くのが良いです。

CanvasやPanelなどは、Window装飾を避けて(その内側に)置かれますから(0,0)から使えます。

ちなみに、
Canvas= new Canvas();してFrameに対して
frame.add(BoarderLayout.CENTER,canvas);
としておいて、
Rectangle f=frame.getBounds();
Rectangle r=canvas.getBounds();
System.out.printf("%d %d %d %d\n",
r.x, // 左
r.y, // 上
f.width-r.width-r.x, // 右
f.height-r.height-r.y // 下
);
して見てみると 窓装飾が食い込んでいる大きさがわかります。

※ この大きさは、OSや、その設定によって変わります。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)