Пользовательское перетаскивание Java в JPanel

Пользовательское перетаскивание Java - нет обратных вызовов TransferHandler.

Я хочу реализовать пользовательские функции перетаскивания для JPanel производный класс. Я следую рекомендациям стандартного учебника DnD:

перетаскивание и передача данных

на первый взгляд, вещи кажутся довольно strightforward, но когда я на самом деле попробуйте, я не получаю никаких признаков того, что происходит какое-либо поведение DnD. В на самом деле, ни один из методов в моем TransferHandler называемый.

Итак, давайте рассмотрим, что я сделал...

Я сделал свой собственный класс контейнера, который объявляет о расширении JPanel:

public class DnDUnitPanel extends JPanel
{
    ...
}

Я скопировал ListTransferHandler из этой демонстрации:

Падение Демо

переименовал класс Как DndUnitTransferHandler, обрезал код, который ссылка на объекты JList и установленную систему.из.метод println() заявления на каждом из 5 методов там.

затем я создаю два экземпляра различные экземпляры DnDUnitPanel, как это:

DnDUnitPanel topPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true);
// topPanel.setDragEnabled(true);
topPanel.setName("Top Panel");
topPanel.setTransferHandler(new DnDUnitTransferHandler());

DnDUnitPanel bottomPanel = new DnDUnitPanel(new GridLayout(0, 4, 6, 6), true);
// bottomPanel.setDragEnabled(true);
bottomPanel.setName("Bottom Panel");
bottomPanel.setTransferHandler(new DnDUnitTransferHandler());

(и я также создаю некоторые экземпляры JLabel и добавляю() их в панели (не показанный.))

когда я пытаюсь перетащить JLabel с одной панели на другую, ничего не происходит. Поэтому я вернулся и перечитал эту страницу:--4-->

Обработчик Передачи

в частности, что он говорит о setDragEnabled ():

turns on drag support. (The default is false.) This method is
defined on each component that supports the drag gesture; the link
takes you to the documentation for JList.

JPanel не имеет метода setDragEnabled (). Поэтому я спросил себя:, что? это означает: "компонент, который поддерживает перетаскивание"?

Я сначала подумал, что это должно означать то, что заявлено к реализации MouseListener and / or MouseMotionListener. Я изменил DnDUnitPanel на заявить, что он реализует, как и все методы. Имеющий сделав это, я увидел, что mousePressed (), mouseClicked(), mouseDragged () и т. д. были вызваны, но все еще ничего в TransferHandler был вызван, и все еще нет курсора перетаскивания указывающий что-то тащили или вот-вот бросят.

затем я посмотрел на источник для самого JList и решил, что "поддерживает жест перетаскивания" на самом деле просто означает то, что имеет свойство 'dragEnabled' со связанными геттером и сеттером.

Итак, я объявил свойство и предоставил геттер и сеттер на DnDUnitPanel, просто скопировав код прямо из самого JList (мышление возможно, что-то, чего я не совсем понимаю, зовет меня. isDragEnabled () и поиск истинного значения для инициирования поведения DnD.)

к сожалению, предоставление этих (и комментарий выше вызовы DnDUnitPanel.setDragEnabled ()) также не имел никакого эффекта.

Так... TransferHandler никогда не вызывается(). Очевидно, что важное здесь отсутствует, но я не вижу, что это может быть.

Я в тупике, что предпринять.

кто-нибудь видит, чего здесь не хватает?

1 ответов


в основном вам нужен источник данных.

посмотреть другие Stackoverflow вопрос, здесь и здесь (хорошее объяснение DnD)