Наткнулся на эту тему, изучая решение той же проблемы. Во-первых, позвольте мне рассказать вам вещи, которые не сработали. Я попытался зарегистрировать MouseListeners и все это в дереве. Проблема заключалась в том, что слушатели мыши TreeUI обрабатывали событие раньше, чем мой JTree, то есть было слишком поздно устанавливать флаг или что-то в этом роде. Кроме того, это решение дало некрасивый код, и я бы его вообще избегал.
Так что теперь для фактического решения!
После нескольких вызовов Thread.dumpStack () для получения дампа стека я нашел метод, который искал для переопределения. Я расширил BasicTreeUI и переопределил «защищенный void selectPathForEvent (путь TreePath, событие MouseEvent)».
Это даст вам доступ к событию мыши, которое вызвало выделение до того, как оно произойдет. Затем вы можете использовать любую логику, в которой вы нуждаетесь, либо event.consume (), и возвращать, если хотите остановить выбор, сделать любой выбор или передать его для обработки по умолчанию, вызвав super.selectPathForEvent (path, event);
Просто не забудьте установить интерфейс, который вы создали в JTree. Эта ошибка потратила впустую несколько минут моей жизни; -)