SwingのPaintの位置がなんかずれる

SwingのPaintの位置がなんかずれる。
そんな悩みをもったことのある日本全国3000万人の女子高生諸君。


僕も同じ悩みを持ちました。


今、自分で、Swing上で、Eclipseのdraw2d のような仕組みを作ってます。
JPanel を継承したオブジェクト(キャンバス)が1個あって、
その上に仮想的にエレメントといわれるものを自分で定義して、
キャンバスの paintComponent メソッドをオーバライドして、
各エレメントの描画メソッドを呼んでやる。
なんてなことをしてます。


そしたら、妙に各エレメントの描画が上方向にずれる・・・
という現象にはまり一日を無駄にしました。


結論としては、FontMetricsを取得しようしたりして、
Component#getGraphics するとずれる。
でした。


getGraphics の実装中に
g.translate(x,y);
というコードがあって、コンポーネントの x, y 座標に Graphics を
translate してました。
そりゃずれるわ!

各エレメントの範囲を判定するのに、
FontMetricsを利用してたんですが、
しょうがないので、
「FontMetricsがnullのときは・・・」って実装にして、
getGraphics は呼ばないように改造。


この記事が Swing でのズレに悩む全国の女子高生の役に立てば幸いです。