2012-06-06 8 views
9

Java Niestandardowe przeciąganie i upuszczanie - brak wywołań zwrotnych do TransferHandler.Niestandardowe przeciąganie i upuszczanie Java w JPanel

Chcę zaimplementować niestandardowe funkcje przeciągania i upuszczania dla podklasy JPanel . I zgodnie z wytycznymi normy DnD Tutorial:

Drag and Drop and Data Transfer

Na pierwszy rzut oka wszystko wydaje się dość strightforward, ale kiedy rzeczywiście spróbować, mam żadnej wskazówki, że każde zachowanie DnD się dzieje. W rzeczywistości, , żadna z metod w moim TransferHandler nie jest wywoływana.

Więc przyjrzyjmy się, co zrobiłem ...

zrobiłem moje własne klasy pojemnika, który deklaruje się rozszerzyć JPanel:

public class DnDUnitPanel extends JPanel 
{ 
    ... 
} 

skopiowane ListTransferHandler z tego Demo:

Drop Demo

zmieniono nazwę klasy na DndUnitTransferHandler, przycięto kod, który jest odnosząc się do JList ob i zainstalował System.out.println() statments na każdej z 5 metod tam.

Następnie wystąpienia dwa różne przypadki DnDUnitPanel tak:

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()); 

(i również tworzyć pewne przykłady JLabel i dodać() im paneli (nie pokazano)).

Kiedy próbuję przeciągnąć etykietę JLabel z jednego panelu do drugiego, nic się nie dzieje. Więc poszedłem z powrotem i ponownie przeczytać tej strony:

Transfer Handler

w szczególności, co mówi o 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 nie ma metody setDragEnabled(). Więc zadałem sobie pytanie, co naprawdę oznacza: "komponent obsługujący gest przeciągania"?

Najpierw pomyślałem, że to musi oznaczać coś, co jest zadeklarowane do implementacji MouseListener i/lub MouseMotionListener. Zmodyfikowałem DnDUnitPanel na , oświadczając, że implementuje on oba i zapewnił wszystkie metody. Po zrobieniu tego, co zrobiłem , mogłem zauważyć, że mousePressed(), mouseClicked(), mouseDragged() itp. Były wywoływane, ale wciąż nic w wywoływaniu TransferHandler było wywoływaniem i nadal nie było kursora przeciągania wskazującego, że coś zostało przeciągnięte lub jest gotowy do zrzucenia.

Potem przyjrzałem się źródłu JList i zdecydowałem, że "obsługuje gest przeciągania" naprawdę oznacza coś, co ma właściwość "dragEnabled" z powiązanym programem pobierającym i ustawiającym.

Tak, oświadczyłem własność i pod warunkiem, że getter i setter na DnDUnitPanel po prostu kopiując kod prosto od samego JList (myślenie może coś nie w pełni zrozumieć dzwoni isDragEnabled() i szuka prawdziwej wartości aby zainicjować zachowanie DnD.)

Niestety, podanie tych (i odkomentowanie powyższych połączeń do DnDUnitPanel.setDragEnabled() również nie przyniosło efektu.

Więc ... TransferHandler nigdy nie zostanie wywołany(). Oczywiście ważne jest, że czegoś ważnego brakuje tutaj, ale nie widzę, co to może być.

Jestem w ślepy zaułek, aby spróbować ponownie.

Ktoś widzi, czego tu brakuje?

Odpowiedz

11

Zasadniczo potrzebujesz źródła danych.

Spójrz na drugim Stackoverflow question, here i here (dobrym wyjaśnieniem DND)

+1

myślę, że najważniejsze, że przybysze do technologii DnD często natknąć się na nie rozpoznaje, że trzeba dostarczyć własne MouseListener lub MouseMotionListener aby rozpocząć przeciąganie (w przypadku komponentów niestandardowych, które nie zapewniają natywnej obsługi). Znalazłem najbardziej przydatny przykład [dreamincode] (http://www.dreamincode.net/forums/topic/209966-java-drag-and-drop-tutorial-part-1-basics-of-dragging/) . Dzięki, @Xeon za odpowiedź. – user1441004

+0

ten ostatni link to 404'd –

+0

@ChrisDrappier Właśnie go zaktualizowałem – Xeon