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や、その設定によって変わります。
この記事へのコメントはこちら