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

Java Custom Drag and Drop — никаких обратных вызовов для TransferHandler.

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

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

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

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

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

public class DnDUnitPanel extends JPanel
{
    ...
}

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

Drop Demo

переименовал класс как 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 никогда не вызывается(). Очевидно, что-то здесь не хватает важного, но я не понимаю, что это может быть.

Я в тупике, что делать дальше.

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

9
задан Jonas 6 June 2012 в 22:10
поделиться