0

リーフ ノードと非リーフ ノードが混在する JTree が正常に動作しています。ツリーのルートにフォーカスを当てると、下矢印キーと上矢印キーが明らかに機能します。私が行いたい小さな変更は、上/下矢印を使用して、フォーカスを次の非リーフ ノードに移動させることです (つまり、リーフ ノードをスキップします)。ツリーを保持している JPanel を上下の矢印キーに応答させ、ノードをチェックしてそれに応じて移動させることで、これを行う方法を (私は思うに) 理解できますが、これはフォーカス サブシステムを再発明しているように思えます。

おそらくツリーの新しいフォーカストラバーサルポリシーを使用して、より簡単な方法はありますか?

ありがとう

4

1 に答える 1

4

パネルはツリー内部のナビゲーションとは関係がなく、フォーカスに関連していません。これはすべて、ツリーの actionMap の keyBindings を介して処理されます。したがって、解決策は、デフォルトのナビゲーション アクションをカスタム アクションに置き換えることです。以下のコード スニペットは、デフォルトに委譲することによってそれを行います。

    final JXTree tree = new JXTree();
    tree.expandAll();
    final Action delegate = tree.getActionMap().get("selectNext");
    Action action = new AbstractAction("navigateNonLeaf") {

        @Override
        public void actionPerformed(ActionEvent e) {
            boolean searching = true;
            while (searching) {
                TreePath old = tree.getLeadSelectionPath();
                delegate.actionPerformed(e);
                TreePath path = tree.getLeadSelectionPath();
                // nothing happened, back off
                if (areSame(old, path)) break;
                Object last = path.getLastPathComponent();
                if (!tree.getModel().isLeaf(last)) {
                    searching = false;
                }
            }
        }

        // TBD: implement "end of tree"
        private boolean areSame(TreePath old, TreePath path) {
            return path.equals(old);
        }
    };
    tree.getActionMap().put("selectNext", action);
于 2012-09-16T09:30:44.100 に答える