JavaのSwingの自作LookAndFeelをそれなりに実現してしまった超最小限のコード
先日こんなJavaソースコードのファイルを自分のHDDもといSSDの中から発掘した。 それなりにおもしろい内容になりそうだったのでここに書いておく。
このクラスは BasicLookAndFeel
クラスの派生クラスになっていて、
オーバライドすべきメソッドだけをオーバライドしたものになっている。
BasicLookAndFeel
クラスは抽象クラス(abstract class)であるため、
これをJFC/SwingのLook And Feelとして使用することはできない。
しかし、派生クラスを上のようにつくってやれば、実はまあまあ動作する。
チェックボタンの絵がないのでチェックされたどうかわからない、
といったところや、JFileChooser
を開こうとするとエラーが
出るので実用にはさすがに向かないだろう。
外見は Windows のクラシックモードに似ている。
これは BasicLookAndFeel
クラスが抽象クラスとはいえ、
Look And Feels の動作に必要な殆どの処理が入っているからできるのである。
もう少し具体的に言えば、BasicLookAndFeel
クラスは Factory Method パターン
のような構成になっていて、ボタンをどのように描画するかといった詳細の処理は
別クラスで行なっている。
それが、例えば BasicButtonUI
クラスである。
BasicLookAndFeel
の派生クラスを作れば、内部で BasicButtonUI
を参照して動作するという仕組みだ。
ただ、すべてが動作するわけではなく JFileChooser
などが動作しない
わけだが、これはさらにそのエラーを対処すれば動作するだろう、が試してはいない。
このような小細工は非Windowsプラットフォーム上で WindowsLookAndFeel
を動かすのにも使える。
こちらは Windows 以外では isSupportedLookAndFeel()
メソッドが
false
を返すようになっているので、それをちょろまかせばよい。
だからといって、Windows 上の WindowsLookAndFeel
のように完全に
動くわけではないのであくまで参考までに。
Reference
- クラス
BasicLookAndFeel
- Java Platform, Standard Edition 6 API 仕様 BasicLookAndFeel.java
- OpenJDK JDK7 Source code.WindowsLookAndFeel.java
- OpenJDK JDK7 Source code.- https://gist.github.com/1693524 - 本稿で使用したソース一式