Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[java] drag and drop in JTree met Java 6

Pagina: 1
Acties:
  • 310 views sinds 30-01-2008
  • Reageer

  • tweakerbee
  • Registratie: Maart 2000
  • Laatst online: 29-11 20:34
Ik ben bezig met het implementeren van dnd in een JTree (binnen een applet).
Probleem is dat ik niet weet hoe ik de nodes van de JTree draggable maak. De code voor de "drops" heb ik wel gevonden:

Java:
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
    public JTree createTree() {
        final JTree tree = new JTree();
        final DefaultTreeModel model = DefaultTree.getTree();
        tree.setModel(model);
        tree.setRootVisible(false);
        tree.setDropMode(DropMode.INSERT);
        tree.setTransferHandler(new TransferHandler() {

            /**
             * Inner DataFlavor class.
             * 
             * @author xxxxxxxxxxxx
             * 
             */
            DataFlavor nodeFlavor = new DataFlavor(nl.impressie.ip.tree.node.DocumentMutableTreeNode.class, "DocumentMutableTreeNode");

            public boolean canImport(TransferHandler.TransferSupport support) {
                if (!support.isDataFlavorSupported(nodeFlavor) || !support.isDrop()) {
                    return false;
                }

                JTree.DropLocation dropLocation = (JTree.DropLocation) support.getDropLocation();
                return dropLocation.getPath() != null;
            }

            public boolean importData(TransferHandler.TransferSupport support) {
                if (!canImport(support)) {
                    return false;
                }

                JTree.DropLocation dropLocation = (JTree.DropLocation) support.getDropLocation();
                TreePath path = dropLocation.getPath();
                Transferable transferable = support.getTransferable();

                DocumentMutableTreeNode transferData;
                try {
                    transferData = (DocumentMutableTreeNode) transferable.getTransferData(nodeFlavor);
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                } catch (UnsupportedFlavorException e) {
                    e.printStackTrace();
                    return false;
                }

                int childIndex = dropLocation.getChildIndex();
                if (childIndex == -1) {
                    childIndex = model.getChildCount(path.getLastPathComponent());
                }

                DocumentMutableTreeNode newNode = new DocumentMutableTreeNode(transferData);
                DocumentMutableTreeNode parentNode = (DocumentMutableTreeNode) path.getLastPathComponent();

                model.insertNodeInto(newNode, parentNode, childIndex);

                TreePath newPath = path.pathByAddingChild(newNode);
                tree.makeVisible(newPath);
                tree.scrollRectToVisible(tree.getPathBounds(newPath));

                return true;

            }

        });
        tree.setDragEnabled(true);

        return tree;
    }


Hoe krijg ik mijn eigen node class (DocumentMutableTreeNode) als Transferable object?

Ik heb veel gezocht op internet, maar er staat overal 'oude' code, dwz niet volgens de Java 6 manier. Suns eigen documentatie lijkt daar ook wat achter te lopen. Weet iemand hoe het wel (netjes) moet?

[ Voor 0% gewijzigd door tweakerbee op 10-11-2008 18:46 . Reden: code tags toegevoegd ]

You can't have everything. Where would you put it?


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 29-11 21:22

Nick_S

++?????++ Out of Cheese Error

Probeer gebruik te maken van code tags, dat houdt het leesbaar.

Verder vond ik de volgende blogs: Top-Level Drop with Swing and Java SE 6 en First Class Drag and Drop Support in Mustang.

Om je eigen class Transferable te maken, zou het volgens mij voldoende moeten zijn om de Transferable interface te implementeren.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • tweakerbee
  • Registratie: Maart 2000
  • Laatst online: 29-11 20:34
Nick_S: Dat klopt! Inmiddels ben ik er ook achter. Je moet je eigen node inderdaad de interface Transferable meegegeven.

Verder moet de Transferhandler ook de volgende methoden bevatten:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            public int getSourceActions(JComponent comp) {
                return COPY_OR_MOVE;
            }
             
            public Transferable createTransferable(JComponent comp) {
                Transferable t = null;
                if(comp instanceof JTree) {
                    t = (Transferable) ((JTree)comp).getSelectionPath().getLastPathComponent();
                }
                return t;
            }
            
            public void exportDone(JComponent source, Transferable data, int action) {
                if(action==MOVE) {
                    if(source instanceof JTree) {
                        JTree tree = (JTree) source;
                        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
                        model.removeNodeFromParent((MutableTreeNode) data);
                    }
                }
            }

You can't have everything. Where would you put it?


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 29-11 21:22

Nick_S

++?????++ Out of Cheese Error

Om eerlijk te zijn weet ik helemaal niks van Swing af. :) Ik heb er al zo'n 5 jaar niks meer mee gedaan.

Blogs opgezocht aan de hand van jouw eigen zoekwoorden. (java 6 drag and drop) En de opmerking over interface implementeren, dit is normaal gesproken standaard java gedrag. Wil je dat jouw objecten bepaalde functionaliteit aan kunnen, implementeer dan de juiste interface met bijbehorende methodes.

Je hele code had ik geeneens doorgelezen omdat het me niet relevant leek tov van de vraag.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'