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 回答