Есть ли способ определить, произойдет ли падение на JTree? - PullRequest
5 голосов
/ 24 мая 2011

У меня есть JTree, где пользователи могут удалять элементы из других компонентов. Когда пользователь наводит курсор на узлы в дереве (во время «режима перетаскивания»), подсвечивается ближайший узел. Это достигается при реализации TransferHandler.

@Override
public boolean canImport(TransferSupport support) {

    //Highlight the most near lying node in the tree as the user drags the 
    //mouse over nodes in the tree.
    support.setShowDropLocation(true);

Каждый раз, когда выбирается новый узел (также во время «режима отбрасывания»), это запускает TreeSelectionEvent. Это, в свою очередь, вызовет созданного мной слушателя, который будет запрашивать базу данных о деталях, связанных с этим узлом.

Теперь я ищу способ как-то отфильтровать события, которые генерируются из выбора узлов во время «режима отбрасывания». Это попытка ограничить количество обращений к базе данных. У кого-нибудь есть идеи о том, как мне этого добиться?

Весь вклад будет высоко оценен!

1 Ответ

1 голос
/ 24 мая 2011

Существует очень косвенный метод выявления этого случая.Вы можете зарегистрировать PropertyChangeListener в свойстве "dropLocation" с компонентом дерева.Он будет вызываться всякий раз, когда изменяется местоположение отбрасывания, и, таким образом, вы можете установить поле dropOn там, которое затем сможете прочитать в TreeSelectionListener.

tree.addPropertyChangeListener("dropLocation", new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent pce) {
        dropOn = pce.getNewValue() != null;
    }
});

tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
    public void valueChanged(TreeSelectionEvent tse) {
        System.out.println(tse + " dropOn=" + dropOn);
    }
});

Обратите внимание, что это вызывает неправильный falseзначение в первый раз, когда он входит в дерево, но затем все последующие события показывают dropOn = true.

...