JTreeTable DnD сумасшедший мигающий курсор

Я использую слегка модифицированную версию примера Sun JTreeTable, основанную на моей собственной модели. Это будет третий пример (закладки на http://java.sun.com/products/jfc/tsc/articles/bookmarks/).

Все работает как положено, кроме поддержки перетаскивания. Я хотел DnD, который больше похож на то, что дает JTree. Поскольку JTreeTable является расширенным JTable, он предоставляет класс JTable.DropLocation для определения мест перетаскивания, который не предлагает достаточно информации при перетаскивании материала в столбец с визуализацией дерева JTreeTable (без пути и без дочернего индекса). Я уже решил эту проблему, создав собственный класс DropLocation, основанный на комбинации его версий JTable и JTree. Я также изменил метод рисования класса TreeTableCellRenderer, который предоставляется упомянутой реализацией JTreeTable, чтобы показать эту новую информацию пользователю (теперь он может видеть, будет ли новый узел помещен внутри, до или после выбранного узла если внутри столбца дерева, как и следовало ожидать от JTree).

Однако есть одна проблема. Курсор мыши сходит с ума, когда место перетаскивания отображается внутри столбца дерева. Он появляется, а затем исчезает через несколько миллисекунд или это происходит так быстро, что курсор перетаскивания даже не отображается. Это происходит и с немодифицированным примером Солнца. Я полностью в темноте, почему это происходит. Нашел другого человека с такой же проблемой на http://www.java.net/node/663106, но предоставленное там решение, по-видимому, устанавливает место размещения компонента равным нулю и больше не может быть получено с помощью метода JTreeTable.getDropLocation(). Мне нужно это, чтобы преобразовать его в мой модифицированный DropLocation, а затем нарисовать что-то на его основе. Я так близок к правильному решению для моего варианта использования, что могу попробовать его на вкус. Эта штука с мигающим курсором — единственное препятствие на моем пути. Любые идеи?

Использование Java 1.6.

P.S.: Я выбрал пользовательский JTreeTable, а не один из существующих компонентов (например, Netbeans Outline или JXTreeTable), потому что все они, похоже, страдают от проблемы JTable.DropLocation и не предлагают поддержку удаления до или после выбранного узла дерева. (только внутри). Если вы знаете о компоненте, который обеспечивает такую ​​функциональность, я был бы рад услышать об этом.


person predi    schedule 23.11.2011    source источник
comment
В постскриптуме этого вопроса я ошибочно обвиняю org.netbeans.swing.Outline и JXTreeTable в том, что они не могут поддерживать удаление до или после выбранного узла дерева. Это неправда, поскольку эти компоненты на самом деле поддерживают его. Оба они являются косвенным подклассом JTable. Хотя это правда, что JTable.DropLocation не предоставляет информацию о пути, вы всегда можете получить ее через строку и столбец таблицы, которые он предоставляет. Если бы я знал об этом, я бы никогда не удосужился запустить свой собственный компонент. Я советую против этого.   -  person predi    schedule 14.06.2013


Ответы (1)


это звучит как проявление основной ошибки #6700748 (не могу проверить, что проклятый парад ошибок занимает целую вечность, чтобы подключиться к ..). Итак, цитируя исправление в JXTreeTable:

    /**
     * {@inheritDoc} <p>
     * 
     * Overridden to hack around #766-swingx: cursor flickering in DnD
     * when dragging over tree column. This is a core bug (#6700748) related
     * to painting the rendering component on a CellRendererPane. A trick
     * around is to let this return false. <p>
     * 
     * This implementation applies the trick, that is returns false always. 
     * The hack can be disabled by setting the treeTable's client property
     * DROP_HACK_FLAG_KEY to Boolean.FALSE. 
     * 
     */
    @Override
    public boolean isVisible() {
        return shouldApplyDropHack() ? false : super.isVisible();
    }


    /**
     * Returns a boolean indicating whether the drop hack should be applied.
     * 
     * @return a boolean indicating whether the drop hack should be applied.
     */
    protected boolean shouldApplyDropHack() {
        return !Boolean.FALSE.equals(treeTable.getClientProperty(DROP_HACK_FLAG_KEY));
    }
person kleopatra    schedule 23.11.2011
comment
Верно. Это правильный ответ. Переопределение TreeTableCellRenderer.isVisible() так, чтобы оно всегда возвращало false, помогает. - person predi; 23.11.2011