Java デスクトップ アプリケーションを作成しています。パネルのコンポーネントのタブ オーダーを変更したいと考えています。独自のフォーカス トラバーサル ポリシーを作成します。パネルでは、2 つの日付選択フィールドを使用します。他のコンポーネントは正確にフォーカスを取得しますが、datechooser フィールドはフォーカスを取得しません。のようにしてみました
List<Component> order=new LinkedList<>();
order.add(pidcmb);
order.add(locationtxt);
order.add(chemicalnametxt);
order.add(fromtxt);//datechooser
order.add(totxt);//datechooser
order.add(generate);
order.add(cancel);
newPolicy = new MyOwnFocusTraversalPolicy(order);
parameter.setFocusTraversalPolicy(newPolicy);
parameter.setFocusCycleRoot(true);
のようなクラスを作成します
class MyOwnFocusTraversalPolicy extends FocusTraversalPolicy
{
List<Component> order;
public MyOwnFocusTraversalPolicy(List<Component> order) {
this.order = new LinkedList<Component>() {};
this.order.addAll(order);
}
@Override
public Component getComponentAfter(Container focusCycleRoot,
Component aComponent)
{
int idx = (order.indexOf(aComponent) + 1) % order.size();
return order.get(idx);
}
@Override
public Component getComponentBefore(Container focusCycleRoot,
Component aComponent)
{
int idx = order.indexOf(aComponent) - 1;
if (idx < 0) {
idx = order.size() - 1;
}
return order.get(idx);
}
@Override
public Component getDefaultComponent(Container focusCycleRoot) {
return order.get(0);
}
@Override
public Component getLastComponent(Container focusCycleRoot) {
return order.get(order.size());
}
@Override
public Component getFirstComponent(Container focusCycleRoot) {
return order.get(0);
}
}