Kleines (stark vereinfachtes) Beispiel zu Drag n Drop beim JTree

Thomas Darimont

Erfahrenes Mitglied
Hallo,

schaut mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;

import javax.swing.DropMode;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

/**
 * @author Tom
 */
public class JTreeDragNDropExample extends JFrame {

	JTree tree;

	public JTreeDragNDropExample() {
		super("JTreeDragNDropExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		tree = new JTree();

		tree.setDragEnabled(true);
		tree.getSelectionModel().setSelectionMode(
				TreeSelectionModel.SINGLE_TREE_SELECTION);
		tree.setDropMode(DropMode.USE_SELECTION);
		tree.setDropTarget(new DropTarget(tree, TransferHandler.MOVE,
				new DropTargetAdapter() {
					@Override
					public void drop(DropTargetDropEvent dtde) {

						TreePath selectionPath = tree.getSelectionPath();
						TreePath sourcePath = selectionPath.getParentPath();

						DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) selectionPath
								.getLastPathComponent();

						Point dropLocation = dtde.getLocation();
						TreePath targetPath = tree.getClosestPathForLocation(
								dropLocation.x, dropLocation.y);

						System.out.println("###################");

						System.out.println("srcPath: " + sourcePath);
						System.out.println("targetPath: " + targetPath);
						System.out.println("selectedNode: " + selectedNode);

						if (isDropAllowed(sourcePath, targetPath, selectedNode)) {
							System.out.println("drop accept");
							DefaultMutableTreeNode targetParentNode = (DefaultMutableTreeNode) targetPath
									.getLastPathComponent();
							DefaultMutableTreeNode sourceParentNode = (DefaultMutableTreeNode) sourcePath
									.getLastPathComponent();

							sourceParentNode.remove(selectedNode);
							targetParentNode.add(selectedNode);

							dtde.dropComplete(true);
							tree.updateUI();
						} else {
							System.out.println("drop: reject");
							dtde.rejectDrop();
							dtde.dropComplete(false);
						}
					}

					private boolean isDropAllowed(TreePath sourcePath,
							TreePath targetPath,
							DefaultMutableTreeNode selectedNode) {
						if (((DefaultMutableTreeNode) sourcePath
								.getLastPathComponent()).isLeaf()) {
						} else if (targetPath.equals(sourcePath)) {
							return false;
						}
						return selectedNode.isLeaf();
					}

				}));

		for (int currentRowIndex = 0; currentRowIndex < tree.getRowCount(); currentRowIndex++) {
			tree.expandRow(currentRowIndex);
		}

		JScrollPane scrollPane = new JScrollPane(tree);
		scrollPane.setPreferredSize(new Dimension(400, 100));

		add(scrollPane);

		pack();
		setVisible(true);

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new JTreeDragNDropExample();
	}
}
Es fehlt hier natürlich noch einiges ... beispielsweise die Signalisierung für nicht erlaubte Drag / Drop Aktionen...
Das kann man aber ganz einfach über entsprechende dragOver(...) / dragEnter(...) Methoden implementieren...
Wie ich Swing hasse...

Gruß Tom
 
Hallo,

seltsamer Zufall, ich hab was ähnliches erst die Tage geschrieben, Das kann ich morgen ja auch mal posten. Das ist etwas ausführlicher. :)

MFG

zEriX
 
Tja schadhaft aber der Post des Drag'n Drop von die Sascha fehlt ja noch immer oder nicht?
 

Neue Beiträge

Zurück