コンポーネントをフォーカス遷移順に並べる
バリデーションネタ。
JFlame上のGUIコンポーネントに関してバリデーションを実施する場合、以下の2通りで実施する必要がある。
前者はフォーカスの遷移やキーストロークに対して実施するが、後者はビジネスロジックの実行前に最終確認の意味で実施される。後者で問題になるのはバリデーションを実施する順序だ。バリデーションは一般的にはエラー発生していることが明確になった時点で中断してエラーを使用者に通知する必要があるため、バリデーションは実際の操作時と同じ、フォーカス遷移と同じ順序で実行する必要がある。
フォーカスの遷移順という処理を考えた場合、.NETのようにGUIがその順序をTabIndex等の序数で持つ場合は序数で昇順にソートした順序がバリデーションの順序となるが、Java Swingの場合はそのようなプロパティは無いので、フォーカスマネジャを使う必要がある。
JFrame jFrame = 対象となるJFrameの参照をセットする //コンポーネントを現在のトラバースポリシの順に並べたリストを作る ArrayListvalidateOrder = 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); }