Дерево добавляет DefaultCellEditor в иерархию JTree при запуске редактирования.Это текстовое поле получает фокус.Когда редактирование остановлено (нажатие Enter), метод BasicTreeUI.completeEditing () проверяет, является ли само дерево или компонент редактора владельцем фокуса.В этом случае дерево будет снова сфокусировано после завершения редактирования.
В алгоритме остановки редактор удаляется из дерева.Ранее он был владельцем фокуса, поэтому фокус будет перенесен на следующий фокусируемый компонент (цикл фокусировки).В вашем пользовательском интерфейсе это будет панель с вкладками.
Из-за того, что редактор был ранее сфокусирован, BasicTreeUI запрашивает фокус для дерева.
Эти шаги идеально соответствуют описанному вами поведению..
Единственное решение (не полное, но показывает направление) - установить собственный FocusTraversalPolicy:
private static class TreeEditorFocusTraversalPolicy extends DefaultFocusTraversalPolicy {
private final JTree tree;
public TreeEditorFocusTraversalPolicy(JTree tree) {
this.tree = tree;
}
@Override
public Component getComponentAfter(Container aContainer, Component aComponent) {
if (aComponent instanceof CellEditor) {
return tree;
}
return super.getComponentAfter(aContainer, aComponent);
}
}
Установить этот экземпляр на свое дерево:
tree.setFocusTraversalPolicy(new TreeEditorFocusTraversalPolicy(tree));
tree.setFocusCycleRoot(true);
Проблема до сих пор: обход фокуса (Tab, Shift + Tab) больше не работает.FocusTraversalPolicy - это огромная часть Swing, и ей нужно некоторое время, чтобы создать рабочую политику.Может быть, взгляните на LegacyGlueFocusTraversalPolicy, которая является политикой по умолчанию.
Надеюсь, это поможет продвинуться дальше.