Java Custom Drag and Drop — никаких обратных вызовов для TransferHandler.
Я хочу реализовать функцию пользовательского перетаскивания для панели JPanel. подкласс. Я следую рекомендациям стандартного учебника по DnD:
Перетаскивание и передача данных
На первый взгляд все кажется довольно простым, но когда я на самом деле попробуйте, я не получаю никаких признаков того, что происходит какое-либо поведение DnD. В на самом деле ни один из методов в моем TransferHandler не вызывается.
Итак, давайте посмотрим, что я сделал...
Я создал свой собственный класс Container, который объявляет себя расширением JPanel:
public class DnDUnitPanel extends JPanel
{
...
}
Я скопировал ListTransferHandler из этой демонстрации:
переименовал класс как DndUnitTransferHandler, обрезанный код, который ссылаясь на объекты JList и установленные статусы System.out.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 с одной панели на другую, ничего не происходит. Поэтому я вернулся и перечитал эту страницу:
, в частности, что там говорится о 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 и/или MouseMotionListener. Я изменил DnDUnitPanel на объявить, что он реализует оба и предоставляет все методы. Имея сделал это, я мог видеть, что mousePressed(), mouseClicked(), mouseDragged() и т. д. вызывались, но в TransferHandler вызывался, и по-прежнему не было курсора перетаскивания, указывающего что-то было перетащено или готово к падению.
Затем я посмотрел исходный код самого JList и решил, что «поддерживает жест перетаскивания» на самом деле просто означает что-то, что имеет Свойство 'dragEnabled' со связанным методом получения и установки.
Итак, я объявил свойство и предоставил геттер и сеттер на DnDUnitPanel, просто скопировав код прямо из самого JList (думая может быть, что-то, что я не совсем понимаю, звонит isDragEnabled() и ищет истинное значение, чтобы инициировать поведение DnD.)
К сожалению, предоставляя их (и раскомментируя приведенные выше вызовы для DnDUnitPanel.setDragEnabled()) также не имел никакого эффекта.
Итак... TransferHandler никогда не вызывается(). Очевидно, что-то здесь не хватает важного, но я не понимаю, что это может быть.
Я в тупике, что делать дальше.
Кто-нибудь видел, чего здесь не хватает?