コンポーネントをフォーカス遷移順に並べる

バリデーションネタ。
JFlame上のGUIコンポーネントに関してバリデーションを実施する場合、以下の2通りで実施する必要がある。

  • 個々のGUIに対して行うバリデーション
  • JFlame上の全てのGUIに対して行うバリデーション

前者はフォーカスの遷移やキーストロークに対して実施するが、後者はビジネスロジックの実行前に最終確認の意味で実施される。後者で問題になるのはバリデーションを実施する順序だ。バリデーションは一般的にはエラー発生していることが明確になった時点で中断してエラーを使用者に通知する必要があるため、バリデーションは実際の操作時と同じ、フォーカス遷移と同じ順序で実行する必要がある。

フォーカスの遷移順という処理を考えた場合、.NETのようにGUIがその順序をTabIndex等の序数で持つ場合は序数で昇順にソートした順序がバリデーションの順序となるが、Java Swingの場合はそのようなプロパティは無いので、フォーカスマネジャを使う必要がある。

JFrame jFrame = 対象となるJFrameの参照をセットする
//コンポーネントを現在のトラバースポリシの順に並べたリストを作る
ArrayList validateOrder = new ArrayList();
FocusTraversalPolicy policy = jFrame.getFocusTraversalPolicy();
Component last = policy.getLastComponent(jFrame);
for( Component curr = policy.getFirstComponent(jFrame); curr != last; curr = policy.getComponentAfter(jFrame, curr)) {
    validateOrder.add(curr);
}