1

アプリケーション全体で複数のパネルに新しいタブ オーダーを設定する作業を行っています。非推奨の 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 メソッドにブレークポイントを挿入しても、トリガーされません。フォーカス トラバーサル ポリシーを扱うのは初めてなので、ここで何が欠けているのか疑問に思っています...

4

2 に答える 2

1

わかりましたので、DefaultFocusTraversalPolicy ではなく FocusTraversalPolicy を継承し、元のポリシーのコピーを渡して、「例外」がない場合に元に戻す必要がありました。また、FocusTraversalPolicy を使用するには、パネルで FocusCycleRoot を true に設定する必要があります。これで、AbstractJPanel 基本クラスに CustomizedTabOrderPolicy のインスタンスを設定して、パネルの初期化で呼び出す必要があるのは次のようなものだけになりました。

    this.setTabOrderEnabled(true);
    this.getCustomTabOrder().addNewException(component1, component2);
    this.getCustomTabOrder().addNewException(component2, component3);
    this.getCustomTabOrder().addNewException(component3, component4);

また、クラス自体を少し変更して、より効果的にしました。

public class CustomizedTabOrderPolicy extends FocusTraversalPolicy {

    private FocusTraversalPolicy oldPolicy;
    private Hashtable<Component, Component> exceptionsMap = new Hashtable<Component, Component>();
    private Hashtable<Component, Component> exceptionsMapReflection = new Hashtable<Component, Component>();
    private Component defaultComponent;
    private Component firstComponent;
    private Component lastComponent;

    public CustomizedTabOrderPolicy(FocusTraversalPolicy oldPolicy) {
        this.oldPolicy = oldPolicy;
    }

    public Component getComponentAfter(Container container, Component component) {
        if (component == this.getLastComponent(container)) {
            if (isValid(this.getFirstComponent(container))) {
                return this.getFirstComponent(container);
            } else {
                return this.getComponentAfter(container, this.getFirstComponent(container));
            }
        }
        if (exceptionsMap.containsKey(component) && isValid(exceptionsMap.get(component))) {
            return exceptionsMap.get(component);
        } else {
            return oldPolicy.getComponentAfter(container, component);
        }
    }

    public Component getComponentBefore(Container container, Component component) {
        if (component == this.getFirstComponent(container)) {
            if (isValid(this.getLastComponent(container))) {
                return this.getLastComponent(container);
            } else {
                return this.getComponentBefore(container, this.getLastComponent(container));
            }
        }
        if (exceptionsMapReflection.containsKey(component) && isValid(exceptionsMapReflection.get(component))) {
            return exceptionsMapReflection.get(component);
        } else {
            return oldPolicy.getComponentBefore(container, component);
        }
    }

    public boolean isValid(Component component) {
        if (component.isEnabled() && component.isVisible() && component.isFocusable()) {
            return true;
        } else {
            return false;
        }
    }
    public Component getDefaultComponent(Container container) {
        if (this.defaultComponent != null) {
            return this.defaultComponent;
        }
        return oldPolicy.getDefaultComponent(container);
    }

    public Component getFirstComponent(Container container) {
        if (this.firstComponent != null) {
            return this.firstComponent;
        }
        return oldPolicy.getFirstComponent(container);
    }

    public Component getLastComponent(Container container) {
        if (this.lastComponent != null) {
            return this.lastComponent;
        } else {
            return oldPolicy.getLastComponent(container);
        }
    }

    public void addNewException(Component origin, Component destination) {
        exceptionsMap.put(origin, destination);
        exceptionsMapReflection.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;
    }
 }
于 2012-11-30T20:38:48.890 に答える