javaを書いて時間を潰した

ひさしぶりにJava、といってもWebアプリを書く気はなくて、Swingアプリのお話。

Windows APIWindows.FormsでUIを書くとコントロール階層で透過の扱いがヘボくて萎えるのだけど、JavaのAWT,Swingはダブルバッファリングがちゃんとしてるので見た目重視のアプリを書くにはむしろ適している。最近だと標準でJavaScriptエンジンまで入ってるしデスクトップに常駐させるアプリケーションを動かす環境としては良いんじゃないだろうか。「javaw.exe -Dsun.java2d.noddraw=true -jar xxxx.jar」 とか書かないと他のDirectXアプリとの相性が悪いことがあるんだけど、これはまあ知ってれば回避できることだしな。

自分の知識は数年前で止まっている、というかもはやライブラリや言語の詳細を完全に忘れたので、自分が昔書いたコードを眺め回している。

今日のテーマはコントロールの背景を透過させて下に画像を表示すること。
透過は基本的にはsetOpaque(false); を呼ぶだけなんだけど、スクロールペインやスプリッターはそれだけじゃうまくいかない。JScrollPaneやJSplitterPaneを継承したクラスを書いてなんとかUIを変更したり、getViewport().setOpaque(false)を呼び出したり。それでもWindows APIでやるより遙かにお手軽だったりする。

コントロールの下に画像を表示するのはRootPaneやLayeredPaneをごちゃごちゃする方法もあるんだけど、それよりJPanelを継承したカスタムパネルをコンポーネント階層の頭に置いてしまうのが手っ取り早いし安定している。J2se1.4の頃はアンチエイリアスがうまく透過しなかったり画像を8ビットインデクスカラーで持たないと描画が重かったりしたものだが、今は問題ないようだ。

IDEも少し試してみたけど、EclipseはやっぱりGUIの編集が弱い。バージョンを選べばプラグインも色々つかえるらしいけど試していない。NetBeansは安定してていいね。