2009年2月6日金曜日

Swingでフォーカス循環させない

長らく書いてませんでした…orz
最近、Javaの勉強も兼ねてLuceneのフロントエンドを作ろうかと考え、UIをSwingを使って作成してました。
Visual Editorを使うとグラフィカルに作成できて楽チンです。
しかし、画面上の最後のコンポーネントにフォーカス後Tabキーを押すと最初のコンポーネントに移動するのはアプリケーションとしては不親切です。
(というかそんな動きのアプリケーションってないような)

そこで、Swingでデフォルトで使用されるLayoutFocusTraversalPolicyを継承し、Tabキーで循環移動させなくしてみました。

このLayoutFocusTraversalPolicyはメソッドがちゃんと定義されているので差分だけコーディングすればオッケーです。
最初のコンポーネントはスーパークラスのgetFirstComponentメソッドで、最後のコンポーネントはgetLastComponentメソッドで取得できます。
なので、getComponentBeforeメソッドをオーバーライドして引数のコンポーネントが最初のコンポーネントの場合は引数のコンポーネントをまんま返すようにします。
最後のコンポーネントの場合はgetComponentAfterメソッドで同様のことをします。

public class ConfigFocusTraversalPolicy extends LayoutFocusTraversalPolicy
{
private static final long serialVersionUID = 1L;
public Component getComponentAfter(Container focusCycleRoot, Component aComponent){
if(super.getLastComponent(focusCycleRoot).equals(aComponent)){
return aComponent;
}
else{
return super.getComponentAfter(focusCycleRoot, aComponent);
}
}
public Component getComponentBefore(Container focusCycleRoot, Component aComponent){
if(super.getFirstComponent(focusCycleRoot).equals(aComponent)){
return aComponent;
}
else{
return super.getComponentBefore(focusCycleRoot, aComponent);
}
}
}


あとはこいつをJFrameやJDialogの初期化メソッド中に以下のように書けば完了です。
this.setFocusTraversalPolicy(new ConfigFocusTraversalPolicy());

こんな簡単な話を理解するのにいっぱい時間がかかってしまった…。
まぁよいお勉強ということで。

0 コメント: