アプリケーション全体で複数のパネルに新しいタブ オーダーを設定する作業を行っています。非推奨の setNextFocusableComponent メソッドとほぼ同じ方法で並べ替えを処理できる新しいクラスを作成したいと考えています。DefaultTreversalPolicyClass を拡張し、getComponentBefore メソッドと getComponentAfter メソッドをオーバーロードするクラスを作成しています。パネル自体の実装は、新しいカスタム クラス (CustomizedTabOrderPolicy と呼びます) を作成してから、タブ オーダーを指定するコンポーネントを追加するのと同じくらい簡単にしたいと考えています。これは、CustomizedTabOrderPolicy クラスの便利なメソッドを介して行います。これにより、タブ オーダーの「リンク」を指定するコンポーネントを Hashtable に追加できます。次に、キーと値が切り替えられる Hastable のコピーを作成します。
以下は私のカスタムクラスです:
import java.awt.Component;
import java.awt.Container;
import java.awt.DefaultFocusTraversalPolicy;
import java.util.Hashtable;
public class CustomizedTabOrderPolicy extends DefaultFocusTraversalPolicy {
private Hashtable<Component, Component> exceptionsMap = new Hashtable<Component, Component>();
private Hashtable<Component, Component> excpetionsMapReflection = new Hashtable<Component, Component>();
private Component defaultComponent;
private Component firstComponent;
private Component lastComponent;
public CustomizedTabOrderPolicy() {
}
@Override
public Component getComponentAfter(Container container, Component component) {
java.awt.Toolkit.getDefaultToolkit().beep();
if (exceptionsMap.containsKey(component)) {
return exceptionsMap.get(component);
} else {
return super.getComponentAfter(container, component);
}
}
@Override
public Component getComponentBefore(Container container, Component component) {
if (exceptionsMap.containsValue(component)) {
return excpetionsMapReflection.get(component);
} else {
return super.getComponentBefore(container, component);
}
}
@Override
public Component getDefaultComponent(Container container) {
if (this.defaultComponent != null) {
return this.defaultComponent;
}
return super.getDefaultComponent(container);
}
@Override
public Component getFirstComponent(Container container) {
if (this.firstComponent != null) {
return this.firstComponent;
}
return super.getFirstComponent(container);
}
@Override
public Component getLastComponent(Container container) {
if (this.lastComponent != null) {
return this.lastComponent;
}
return super.getLastComponent(container);
}
public void addNewException(Component origin, Component destination) {
exceptionsMap.put(origin, destination);
excpetionsMapReflection.put(destination, origin);
}
public void setDefaultComponent(Component defaultComponent) {
this.defaultComponent = defaultComponent;
}
public void setLastComponent(Component lastComponent) {
this.lastComponent = lastComponent;
}
public void setFirstComponent(Component firstComponent) {
this.firstComponent = firstComponent;
}
}
これを実装するために、JPanel で以下を使用しています。
CustomizedTabOrderPolicy customPolicy = new CustomizedTabOrderPolicy();
customPolicy.addNewException(<component1>, <component2>);
customPolicy.addNewException(<component3>, <component4>);
customPolicy.addNewException(<component5>, <component6>);
this.setFocusTraversalPolicy(customPolicy);
コンパイラ エラーや実行時エラーは発生しませんが、CustomTabOrderPolicy が JPanel でまったく使用されていないようです。getComponentBefore メソッドと getComponentAfter メソッドにブレークポイントを挿入しても、トリガーされません。フォーカス トラバーサル ポリシーを扱うのは初めてなので、ここで何が欠けているのか疑問に思っています...