tutorials.de Buch-Aktion 02/2012
Like Tree1Danke
  • 1 Beitrag von miffi
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
432
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Hi Leute,
    hab mal versucht das generelle D&D Konzept zu verstehen und es auf mein Problem anzuwenden. Habe 2 JList zwischen denen allgemeine Objekte per Drag & Drop ausgetauscht werden sollen. Dabei soll in die eine Liste das Objekt kopiert werden und falls erfolgreich dieses Objekt aus der anderen Liste gelöscht werden. Hab mal ein paar Ansätze realisiert, erscheint mir alles aber ziemlich star und undynamisch zu sein, sprich Viele setzen einfach hart ein listmodel und dementsprechend addelement und remove mit in den DropTargetListener:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
            list1.setDropTarget(new DropTarget(list1, new DropTargetAdapter() {
                public void drop(DropTargetDropEvent dtde) {
                    try {
                        SomeClass someClass = (SomeClass) dtde.getTransferable()
                                .getTransferData(someClassFlavor);
                        listModel1.removeElement(someClass);
                        listModel2.addElement(someClass);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }));
    Wollte hingegen um es auch für andere Sachen wie JTable etc. anwenden zu können es dynamischer gestalten und die Componenten aus den Events bekommen. So hier jetzt mal Ansatz:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    
    ...
            this.objectFlavor = new DataFlavor(Object.class, Object.class
                    .getSimpleName());
     
            DragSource dragSource = new DragSource();
            DragGestureRecognizer dgr = dragSource
                    .createDefaultDragGestureRecognizer(listVerfuegbareProdukte,
                            DnDConstants.ACTION_MOVE,
                            new DragGestureObjectListener());
            dgr.getDragSource().addDragSourceListener(
                    new DragSourceObjectListener());
            listVerfuegbareProdukte.setDropTarget(new DropTarget(
                    listVerfuegbareProdukte, DnDConstants.ACTION_MOVE,
                    new DropTargetObjectListener()));
     
            DragSource dragSource2 = new DragSource();
            DragGestureRecognizer dgr2 = dragSource2
                    .createDefaultDragGestureRecognizer(listSelektierteParameter,
                            DnDConstants.ACTION_MOVE,
                            new DragGestureObjectListener());
            dgr2.getDragSource().addDragSourceListener(
                    new DragSourceObjectListener());
            listSelektierteParameter.setDropTarget(new DropTarget(
                    listSelektierteParameter, DnDConstants.ACTION_MOVE,
                    new DropTargetObjectListener()));
    ...
     
        private class DropTargetObjectListener implements DropTargetListener {
            @Override
            public void dragEnter(DropTargetDragEvent dtde) {
            }
     
            @Override
            public void dragExit(DropTargetEvent dte) {
            }
     
            @Override
            public void dragOver(DropTargetDragEvent dtde) {
            }
     
            @Override
            public void drop(DropTargetDropEvent dtde) {
                try {
                    Transferable tr = dtde.getTransferable();
                    JList tempList = (JList) ((DropTarget) dtde.getSource())
                            .getComponent();
                    Object obj = null;
                    for (DataFlavor flav : tr.getTransferDataFlavors()) {
                        obj = tr.getTransferData(flav);
                    }
                    ((DefaultListModel) tempList.getModel()).addElement(obj);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
     
            @Override
            public void dropActionChanged(DropTargetDragEvent dtde) {
            }
     
        }
     
        private class DragSourceObjectListener implements DragSourceListener {
            @Override
            public void dragDropEnd(DragSourceDropEvent dsde) {
                boolean drop = dsde.getDropSuccess();
                TransferableObjectClass tr = (TransferableObjectClass) dsde
                        .getDragSourceContext().getTransferable();
                JList tempList = (JList) dsde.getDragSourceContext().getComponent();
                Object obj = null;
                for (DataFlavor flav : tr.getTransferDataFlavors()) {
                    try {
                        obj = tr.getTransferData(flav);
                    } catch (UnsupportedFlavorException e) {
                        e.printStackTrace();
                    }
                }
                ((DefaultListModel) tempList.getModel()).removeElement(obj);
            }
     
            @Override
            public void dragEnter(DragSourceDragEvent dsde) {
            }
     
            @Override
            public void dragExit(DragSourceEvent dse) {
            }
     
            @Override
            public void dragOver(DragSourceDragEvent dsde) {
            }
     
            @Override
            public void dropActionChanged(DragSourceDragEvent dsde) {
            }
     
        }
     
        private class DragGestureObjectListener implements DragGestureListener {
            @Override
            public void dragGestureRecognized(DragGestureEvent e) {
                JList tempList = (JList) e.getComponent();
                Object obj = tempList.getSelectedValue();
                TransferableObjectClass transferable = new TransferableObjectClass(
                        obj);
                e.startDrag(DragSource.DefaultMoveDrop, transferable);
            }
     
        }
     
        private class TransferableObjectClass implements Transferable {
            private Object object;
     
            public TransferableObjectClass(Object object) {
                this.object = object;
            }
     
            public Object getTransferData(DataFlavor flavor)
                    throws UnsupportedFlavorException {
                if (!flavor.equals(objectFlavor)) {
                    throw new UnsupportedFlavorException(flavor);
                }
                return this.object;
            }
     
            public DataFlavor[] getTransferDataFlavors() {
                return new DataFlavor[] { objectFlavor };
            }
     
            public boolean isDataFlavorSupported(DataFlavor flavor) {
                return flavor.equals(objectFlavor);
            }
        }

    Jetzt funktioniert das ganz schon so ganz oke nur wenn ich den Drag auserhalb also im nicht gültigen Bereich beende wird das Objekt aus der JList trotzdem gelöscht.
    1. Was fehlt bei diesem Ansatz noch um dieses Problem zu lösen
    2. Wie würde ein genereller Ansatz zur Implementierung von D&D aussehen, bezüglich DragGestureListener, DragSourceListener,DropTargetListener, Transferable und Transferhandler. Mache überschreiben ja den Transferhandler anderer erstellen eigene Dataflavor Transferable u.s.w. Habe halt noch nicht so ganz die Zusammenhänge zwischen den einzelnen Elementen verstanden.

    Mit dem Tuturial von Sun konnte ich so nichts anfangen bzw. ist mein Englisch nicht so gut um da mal schnell drüber zu lesen.

    Wäre cool wenn mir jemand besonders zu Punkt 2Tips, Links oder eine direkte Erklärung geben kann.

    Gruß Jan
    Geändert von ElJarno (19.08.10 um 08:47 Uhr)
     

  2. #2
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Howdie.

    Das Problem ist, dass DnD per Tranferhandler zu erklären recht viel Zeit erfordert. Daher würde ich hier nur bedingt mit ausführlichen Antworten rechnen.
    Ich hab mich auch mit dem Sun-Tutorial langsam rangetastet und es ist recht großer Haufen Code geworden. Was ich von vor herein sagen kann: Falls du lediglich DnD-fähige Swing-Komponenten benutzt (JList, JTable, JTree...), brauchst du weder DragGestureListener, -Source- oder -TargetListener. Diese Komponenten erkennen DnD-Gestures selbst und erkennen auch die entsprechenden Tasten-Kombinationen, wenn sie per setDragEnabled() und setDropMode() konfiguriert wurden.

    Eine kurze Übersicht über die nötigen Schritte:
    1. Schreib dir eine Transfer-Klasse, welche beim DnD-Vorgang die ex-/importierten Daten enthält. Implementiere hier das Interface Transferable
    2. Leite eine (am besten für jede beteiligte Swing-Komponente eine individuelle) Klasse vom Typ TransferHandler ab und überschreib die Methoden
      - createTransferable(JComponent c) -> erzeugt ein Transferable-Objekt und gibt es für den Export zurück. Diese Methode wird z.B. aufgerufen, wenn du Strg+C drückst oder die entsprechende Maus-Bewegung durchführst.
      - importData(TransferSupport support) -> das TransferSupport-Objekt enthält die importierten Daten in Form eines Transferable-Objekts, die du jetzt auslesen und dem Ziel-Objekt hinzufügen kannst
    3. Füge der Swing-Komponente eine Instanz der TransferHander-Klasse über setTransferHandler() hinzu.

    Hier gibts es allerdings echt noch ein paar Sachen zu beachten... Du musst Data-Flavors überprüfen, Legitimität von DnD-Vorgängen, zwischen DnD und CCP unterscheiden, usw.
    Ich würde mich an deiner Stelle (vielleicht mit Google-Translator) doch mal an das Tutorial von Sun wagen.

    Gruß und viel Erfolg
    miffi
    Geändert von miffi (20.08.10 um 09:40 Uhr)
    ElJarno bedankt sich. 
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams

Ähnliche Themen

  1. JQuery Listen sortieren/Drag/Drop?
    Von bernd00 im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 12.10.10, 17:23
  2. Drag & Drop zwischen 2 Auswahllisten(anfänger)
    Von Nugorra im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 26.08.08, 17:35
  3. Drag and Drop zwischen Listboxen
    Von deusfalsus im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 21.01.08, 12:08
  4. Drag & Drop zwischen versch. Anwendungen
    Von Centin im Forum Borland CBuilder und VCL
    Antworten: 0
    Letzter Beitrag: 17.01.08, 19:27
  5. Drag n' Drop zwischen 2 Listboxen
    Von astaluego im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 21.03.05, 13:12