我有一个运行良好的 JTree,混合了叶节点和非叶节点。当我给树根焦点时,向下箭头和向上箭头键会做明显的事情。我想做的一个小改变是让向上/向下箭头导致焦点转到下一个非叶节点(即跳过叶节点)。我可以(我认为)通过让持有树的 JPanel 响应向上和向下箭头键、检查节点并相应地移动来了解如何做到这一点,但这似乎是在重新发明焦点子系统。
有没有更简单的方法,也许是树的新焦点遍历策略?
谢谢
面板都与树内部导航无关,也与焦点无关。这一切都是通过树的 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);