先日こんなJavaソースコードのファイルを自分のHDDもといSSDの中から発掘した。 それなりにおもしろい内容になりそうだったのでここに書いておく。

import javax.swing.plaf.basic.BasicLookAndFeel;

public class VerySimpleLookAndFeel extends BasicLookAndFeel {

    public String getDescription() {
        return "This is " + getName();
    }

    public String getID() {
        return "VerySimpleLookAndFeel";
    }

    public String getName() {
        return "Very Simple Look & Feel";
    }

    public boolean isNativeLookAndFeel() {
        return false;
    }

    public boolean isSupportedLookAndFeel() {
        return true;
    }
}

このクラスは 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