Drag&Drop zwischen 2 Listen

ElJarno

Bekanntes Mitglied
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:
Java:
		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:
Java:
...
		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
 
Zuletzt bearbeitet:

carolin

Mitglied

ElJarno

Bekanntes Mitglied
Ja diese Seiten hab ich mir schon angegguckt, aber wie gesagt das sind ja immer völlig verschiedene Ansätze und das Tutorial von dpunkt ist auch wieder ehe schnell und starr als wirklich sauber und allgemeingültig.
Habs jetzt mit nem Transferhandler gemacht.
Java:
	class MyTransferHandler extends TransferHandler {

		// Our transfer handler needs to know about the
		// two JLists !
		JList left, right;

		public MyTransferHandler(JList l, JList r) {
			super();
			left = l;
			right = r;
		}

		// This is the method called when a drop occurs.
		// The parameter c is where something is being dropped
		// (one of our two JLists).
		// The parameter t is the thing being dropped
		public boolean importData(JComponent c, Transferable t) {
			JList jl = (JList) c;

			try {
				int sourceIndex = Integer.parseInt((String) t
						.getTransferData(DataFlavor.stringFlavor));

				// figure out which is the source and which is the dest.
				DefaultListModel source, dest;

				if (jl == left) {
					source = (DefaultListModel) right.getModel();
					dest = (DefaultListModel) left.getModel();
				} else {
					source = (DefaultListModel) left.getModel();
					dest = (DefaultListModel) right.getModel();
				}
				// grab the Candy object from the source CandyListModel
				Object f = source.getElementAt(sourceIndex);
				// add it to the other model.
				dest.addElement(f);
				// and remove from the source
				source.remove(sourceIndex);
			} catch (Exception e) {
				System.out.println("Import failed!");
				return (false);
			}
			return (true);
		}

		/**
		 * creates a StringSelection transferrable. The string is just an
		 * integer converted to string (if we actually transferred an int, we
		 * would need to write our own Transferrable, this way we can just use
		 * StringSelection).
		 * 
		 * The JComponent passed in is the JList from which something is being
		 * dragged. We look up the selected index, convert this to a string and
		 * wrap in a StringSelection transferrable.
		 */

		protected Transferable createTransferable(JComponent c) {
			JList jl = (JList) c;
			// we want the currently selected index
			Integer index = new Integer(jl.getSelectedIndex());
			// and we transfer it as a string
			Transferable t = new StringSelection(index.toString());
			return t;
		}

		// We have to specify that things can be dragged
		// MOVE or
		public int getSourceActions(JComponent c) {
			return MOVE;
		}

		// This is called before a drop, to make sure that we
		// can handle the incoming data type. The flavors array
		// is a list of the data flavors the incoming data is available in.
		// All we want is a Unicode String, so we look for that and return
		// true if we find it.
		// This is more significant if we were supporting drag and drop
		// from non-java programs....

		public boolean canImport(JComponent c, DataFlavor[] flavors) {
			for (int i = 0; i < flavors.length; i++) {
				if (flavors[i].getHumanPresentableName().equals(
						"Unicode String")) {
					return (true);
				}
			}
			return (false);
		}
	}
}

(Wenn du viel programmierst, dann lohnt es sich übrigens, Sachen auf Englisch lesen zu können, weil sich sehr viel in dieser Sprache findet und du dann auch die Möglichkeit hast im WWW auf Deutsch und Englisch suchen zu können.)

;-) Jo des stimmt schon. En bisl gehts ja auch nur wenn dann son Tuturial von Sun über 20 Seiten geht, dann verkiert man schon mal schnell die Lust, zumal ja auch viele Fachwörter verwendet werden die einem nicht so geläufig sind, von daher versuch ich in solchen Situationen dann erst mal was in Foren zu finden.

Gruß Jan
 
Zuletzt bearbeitet:

ElJarno

Bekanntes Mitglied
Danke der Nachfrage auch noch nich erlebt.:) Hab jetzt den Quelltext aufe Firma hab nen Handler im Internet gefunden. Poste ich dann am Montag.

Gruß Jan
 

ElJarno

Bekanntes Mitglied
Besser spät als nie:D:

Java:
public class SuchePanelComponents implements Transferable {
	private String titel;
	private int row;
	private Component component;
	private String dbColumnName;
	private DataFlavor objectFlavor;

	public SuchePanelComponents(String titel, Component component, int row,
			String dbColumnName) {
		super();
...

		this.objectFlavor = new DataFlavor(SuchePanelComponents.class,
				SuchePanelComponents.class.getSimpleName());
	}

	@Override
	public Object getTransferData(DataFlavor flavor)
			throws UnsupportedFlavorException {
		if (!flavor.equals(objectFlavor)) {
			throw new UnsupportedFlavorException(flavor);
		}
		return this;
	}

	@Override
	public DataFlavor[] getTransferDataFlavors() {
		return new DataFlavor[] { objectFlavor };
	}

	@Override
	public boolean isDataFlavorSupported(DataFlavor flavor) {
		return flavor.equals(objectFlavor);
	}

	@Override
	public int hashCode() {
		return toString().hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		return this.toString().equals(obj.toString());
	}
}

...

	private class MyTransferHandler extends TransferHandler {
		private static final long serialVersionUID = 1L;
		JList left, right;

		public MyTransferHandler(JList l, JList r) {
			super();
			left = l;
			right = r;
		}

		public boolean importData(JComponent c, Transferable t) {
			JList jl = (JList) c;
			try {
				Object obj = null;
				DataFlavor[] df = t.getTransferDataFlavors();
				for (DataFlavor flav : df) {
					obj = t.getTransferData(flav);
				}
				DefaultListModel source, dest;

				if (jl == left) {
					source = (DefaultListModel) right.getModel();
					dest = (DefaultListModel) left.getModel();
				} else {
					source = (DefaultListModel) left.getModel();
					dest = (DefaultListModel) right.getModel();
				}
				if (!dest.contains(obj)) {
					dest.addElement(obj);
					source.removeElement(obj);
				} else {
					return false;
				}
			} catch (Exception e) {
				System.out.println("Import failed!");
				return false;
			}
			return true;
		}

		protected Transferable createTransferable(JComponent c) {
			JList jl = (JList) c;
			return (Transferable) jl.getSelectedValue();
		}

		public int getSourceActions(JComponent c) {
			return MOVE;
		}

		public boolean canImport(JComponent c, DataFlavor[] flavors) {
			for (int i = 0; i < flavors.length; i++) {
				if (flavors[i].getHumanPresentableName().equals(
						"SuchePanelComponents")) {
					return true;
				}
			}
			return false;
		}
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
G Drag&Drop zwischen JTables AWT, Swing, JavaFX & SWT 2
I Drag and Drop zwischen zwei JTables AWT, Swing, JavaFX & SWT 5
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
AmsananKING ListView Drag And Drop AWT, Swing, JavaFX & SWT 0
AmsananKING Drag And Drop Filenames Inside A Listview AWT, Swing, JavaFX & SWT 1
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
F Drag&Drop mit Transparenter Farbe bei PNG AWT, Swing, JavaFX & SWT 0
D JavaFX Pane per Drag&Drop bewegen? AWT, Swing, JavaFX & SWT 2
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
F Drag und Drop AWT, Swing, JavaFX & SWT 0
L JavaFX JavaFX Chart Drag and Drop AWT, Swing, JavaFX & SWT 3
D JavaFX Drag&Drop mehrerer TreeViews oder TableViews AWT, Swing, JavaFX & SWT 1
U Drag and Drop mit imageview AWT, Swing, JavaFX & SWT 0
U Drag and Drop imageviews AWT, Swing, JavaFX & SWT 8
D SteelSeries in Netbeans als Drag-and-Drop einbinden AWT, Swing, JavaFX & SWT 0
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
S Swing Suche Drag & Drop Beispiele AWT, Swing, JavaFX & SWT 1
A Drag and Drop mit JAVAFX- Scenebuilder AWT, Swing, JavaFX & SWT 1
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
R Drag and Drop Problem auf Jpanel AWT, Swing, JavaFX & SWT 2
N Swing JTable und Drag und Drop AWT, Swing, JavaFX & SWT 2
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
C Drag and Drop (inventar) AWT, Swing, JavaFX & SWT 15
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
Iron Monkey JFileChooser - Drag and Drop AWT, Swing, JavaFX & SWT 5
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
HaukeG Swing Drag & Drop in verschiedenen Varianten AWT, Swing, JavaFX & SWT 4
S Swing Drag&Drop mit TransferHandler und JPanels AWT, Swing, JavaFX & SWT 8
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
R Drag 'n Drop AWT, Swing, JavaFX & SWT 3
S Selektion bei Drag&Drop AWT, Swing, JavaFX & SWT 4
C Swing Drag and Drop mit Objekten in einem Fenster. AWT, Swing, JavaFX & SWT 9
T SWT Drag&Drop: Eclipse FileTransfer mit Icons AWT, Swing, JavaFX & SWT 14
F Drag & Drop durch Verbindungslinien AWT, Swing, JavaFX & SWT 10
T Swing Drag and Drop - JLabels tauschen statt überschreiben AWT, Swing, JavaFX & SWT 11
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
B Drag and Drop AWT, Swing, JavaFX & SWT 6
K Drag and Drop Workbench AWT, Swing, JavaFX & SWT 2
P SWT Eclipse Draw2D Drag and Drop (ruckelt) AWT, Swing, JavaFX & SWT 4
F SWT Drag and Drop im TreeViewer AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
A TransferHandler & Drag n' Drop AWT, Swing, JavaFX & SWT 2
R Drag an Drop JTable Zelle AWT, Swing, JavaFX & SWT 6
D Drag & Drop - node.isRoot AWT, Swing, JavaFX & SWT 3
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
E Swing Beim Drag & Drop, Drag verbieten?! AWT, Swing, JavaFX & SWT 2
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
F Swing Problem mit Drag&Drop in JTable AWT, Swing, JavaFX & SWT 4
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
M Swing JTable Drag'n'Drop von Dateien AWT, Swing, JavaFX & SWT 3
M Drag and Drop: Quellfenster AWT, Swing, JavaFX & SWT 2
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
M Swing JList > Drag & Drop AWT, Swing, JavaFX & SWT 2
C Drag an Drop vom JTree zur JTable AWT, Swing, JavaFX & SWT 4
Z Drag and Drop auf Application AWT, Swing, JavaFX & SWT 3
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
H Drag&Drop von JComponents AWT, Swing, JavaFX & SWT 6
G JTable drag and drop AWT, Swing, JavaFX & SWT 4
H Drag&Drop mit GWT AWT, Swing, JavaFX & SWT 8
B Swing Drag&Drop einzelner Zellen in einer JTable AWT, Swing, JavaFX & SWT 12
A Swing Drag and Drop TreeNode User Object AWT, Swing, JavaFX & SWT 3
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
K Swing Wie ändere ich die default action für Drag&Drop AWT, Swing, JavaFX & SWT 6
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
V SWT TreeViewer Drag'n'Drop LocalSelectionTransfer AWT, Swing, JavaFX & SWT 10
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
F Drag & Drop mit eigenen Komponenten AWT, Swing, JavaFX & SWT 2
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
S Drag'n'Drop AWT, Swing, JavaFX & SWT 8
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
M Drag & Drop in Swing (createTransferable) AWT, Swing, JavaFX & SWT 6
T Drag Quelle beim Drop AWT, Swing, JavaFX & SWT 6
A Drag & Drop von Zeilen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 2
E Drag & Drop von jTree in JList AWT, Swing, JavaFX & SWT 5
P Dateien per Drag&Drop ins Java-Fenster ziehen AWT, Swing, JavaFX & SWT 8
G JTree Node ggf. aufklappen bei Drag & Drop? AWT, Swing, JavaFX & SWT 7
J Drag'n Drop imm selben Frame unterbinden AWT, Swing, JavaFX & SWT 3
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
X wiedermal Drag n Drop AWT, Swing, JavaFX & SWT 2
P Drag & Drop AWT, Swing, JavaFX & SWT 2
X Drag and Drop AWT, Swing, JavaFX & SWT 2
F Drag&Drop Jlist -> JList AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben