Drag and Drop zwischen zwei JTables

Status
Nicht offen für weitere Antworten.
I

ich²

Gast
Hi Forum,

ich habe mal wieder ein Problem. Und zwar würde ich gerne für meine User eine Möglichkeit schaffen, Daten von einer Tabelle in eine andere zu ziehen (die Daten bleiben dabei in der 1. Tabelle enthalten). Von der 2. Tabelle muss nicht wieder zurück in die 1. geschoben werden können. Mir würde es im Prinzip schon genügen bei einem Drag von Tabelle 1 eine kleine Animation oder ähnliches am Mauszeiger anzuzeigen und über z. B. einen Listener mitzubekommen, wenn die Maus über Tabelle 2 losgelassen wurde.

Danke!

mfg

ich²
 
I

ich²

Gast
Hi Beni,

danke für deine Antwort. Kannst du mir die relevanten Textzeilen evtl. hier rein kopieren? Die Seite wurde leider von unserem Web-Filter gesperrt :cry: .

Danke!

mfg

ich²
 
B

Beni

Gast
Schlag deinen Admin ...

Seit der Version [1.4]1.4 kann man bei Swing-Komponenten Drag-and-Drop sehr einfach mit Hilfe der Methode setDragEnabled(boolean value) aktivieren.

Dabei bezieht sich die Aktivierung nur auf den Lieferanten - die Komponenten, die nicht aktiviert wurden, können jederzeit die verschobenen Daten aufnehmen. Welche Komponenten Drag-and-Drop unterstützen ist in folgender Tabelle aufgeführt:

Bei Swing-Komponenten, die von Natur aus kein Drag-and-Drop unterstützen, wie beispielsweise JLabel, kann man dies seit der Version [1.4]1.4 durch folgenden Code nachprogrammieren:

JLabel label = new JLabel();
label.setTransferHandler(new TransferHandler("text"));
label.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
JComponent c = (JComponent)e.getSource();
TransferHandler th = c.getTransferHandler();
th.exportAsDrag(c, e, TransferHandler.COPY);
}
});

Das Entscheidende ist dabei der String des Konstruktors der Klasse TransferHandler. Hierbei handelt es sich um eine JavaBeans-Property, so dass hier das zu transferierende Objekt mittels der get-Methode »getText« geholt bzw. über die Setter-Methode »setText« gesetzt wird.

Tabelle 8.4: Einfache Unterstützung von Drag-and-Drop der Swing-Standardkomponenten seit der Version 1.4 Komponente Unterstützt Drag Unterstützt Drop
JColorChooser X X
JEditorPane X X
JFileChooser X
JFormattedTextField X X
JLabel
JList X
JPasswordField X
JTable X
JTextArea X X
JTextField X X
JTextPane X X
JTree X

java.awt.dnd.DropTarget

Möchte man mehr Kontrolle über den Drag-and-Drop-Vorgang erhalten bzw. steht nur eine ältere Version von Java zur Verfügung, kann man über die Packages java.awt.datatransfer und java.awt.dnd die nötigen Klassen einbinden.

Wie beim Copy-and-Paste werden die Daten mit Hilfe des Transferable-Interfaces ausgetauscht.

Wenn man nur auf das »Fallenlassen« reagieren möchte, benötigt man ein DropTarget. Dieses initialisiert man mit der Komponente, die das Ziel darstellt und einem DropTargetListener. Dieses Interface definiert die folgenden Methoden:

* public void dragEnter(DropTargetDragEvent e)
Wird aufgerufen, wenn von außen ein hinübergezogenes Objekt die Komponente erreicht.
* public void dragExit(DropTargetEvent e)
Wird aufgerufen, wenn der gedrückte Mauszeiger die Komponente verlässt.
* public void dragOver(DropTargetDragEvent e)
Wenn die gedrückte Maus über die Komponente gezogen wird, wird diese Methode mehrmals aufgerufen, um über die aktuelle Position des Mauszeigers innerhalb der Komponente zu informieren.
* public void drop(DropTargetDropEvent e)
Wird die Maustaste losgelassen (Drop), wird diese Methode aufgerufen.
* public void dropActionChanged(DropTargetDragEvent e)
Wenn die gewünschte Aktion (Kopieren, Verschieben oder Verknüpfen) geändert wurde (meist über die Tastatur wie z.B. die Shift-Taste auf Windows), wird diese Methode aufgerufen.

Besonders wichtig ist hierbei die Methode drop. In dieser Methode muss entschieden werden, was mit dem übertragenen Objekt gemacht werden soll. Entweder es wird übernommen oder zurückgewiesen.

Der Ablauf ist dabei folgender:

* Abfrage der DataFlavors.
* Wenn eine passende Form gefunden wurde, wird DropTargetDropEvent.acceptDrop(int dropAction) aufgerufen. Typischerweise, wenn der Benutzer die Aktion selbst bestimmen darf, sieht der Aufruf folgendermaßen aus:

e.acceptDrop(e.getDropAction());
* Über das Transferable-Interface wird das entsprechende Objekt weiterverarbeitet.
* Zum Abschluss wird als Bestätigung die Methode DropTargetDragEvent.dropComplete(boolean success) mit dem passenden Wert aufgerufen. Die Methode wird verlassen.
* Falls bei Punkt 2. kein passendes Format gefunden wurde, wird die Methode DropTargetDragEvent.rejectDrop() aufgerufen.

Hat man eine Komponente, die aus vielen unterschiedlichen Bereichen (wie ein Baum oder eine Tabelle) besteht, möchte man vielleicht, dass nur an bestimmten Bereichen ein Fallenlassen erlaubt ist. Zu diesem Zweck kann man in den Methoden dragEnter und dragOver entweder die Methode DropTargetDragEvent.acceptDrop(int dropAction) oder DropTargetDragEvent.rejectDrop() aufrufen, je nachdem, ob an der Stelle ein Fallenlassen erlaubt ist oder nicht. Dies wird meist an der Position der Maus (DropTargetDragEvent.getLocation()) innerhalb der Komponente bestimmt.

Wenn man dem Benutzer nicht die Wahl lassen möchte, ob er das Objekt verschieben, kopieren oder verknüpfen darf, dann muss lediglich die entsprechende dropComplete()-Methode mit einem der folgenden Werte gefüllt werden: DnDConstants.ACTION_COPY, DnDConstants.ACTION_COPY_OR_MOVE, DnDConstants.ACTION_LINK, DnDConstants.ACTION_MOVE. Wer keine Vorgaben machen möchte, kann die aktuelle Aktion mittels DropTargetDragEvent.getDropAction() beibehalten.

label = new JLabel();
DropTargetListener dropTargetListener =
new DropTargetListener() {

// Die Maus betritt die Komponente mit
// einem Objekt
public void dragEnter(DropTargetDragEvent e) {}

// Die Komponente wird verlassen
public void dragExit(DropTargetEvent e) {}

// Die Maus bewegt sich über die Komponente
public void dragOver(DropTargetDragEvent e) {}

public void drop(DropTargetDropEvent e) {
try {
Transferable tr = e.getTransferable();
DataFlavor[] flavors = tr.getTransferDataFlavors();
for (int i = 0; i < flavors.length; i++)
if (flavors.isFlavorJavaFileListType()) {
// Zunächst annehmen
e.acceptDrop (e.getDropAction());
List files = (List) tr.getTransferData(flavors);
// Wir setzen in das Label den Namen der ersten
// Datei
label.setText(files.get(0).toString());
e.dropComplete(true);
return;
}
} catch (Throwable t) { t.printStackTrace(); }
// Ein Problem ist aufgetreten
e.rejectDrop();
}

// Jemand hat die Art des Drops (Move, Copy, Link)
// geändert
public void dropActionChanged(
DropTargetDragEvent e) {}
};
DropTarget dropTarget = new DropTarget(
label, dropTargetListener);


java.awt.dnd.DragSource

Um eine Komponente als Quelle eines Drag-and-Drop-Vorganges zu verwenden, muss ein Exemplar der Klasse DragSource initialisiert werden.

Mit createDefaultDragGestureRecognizer(Component c, int actions, DragGestureListener dgl) kann die entsprechende Quell-Komponente, die beabsichtigte Aktion und der Listener für den Start eines Drag-Events registriert werden.

Das Interface DragGestureListener besitzt nur die Methode

public void dragGestureRecognized(DragGestureEvent dge)

Diese Methode wird aufgerufen, wenn der Benutzer bei gedrückter Maustaste den Mauszeiger bewegt. Ob dadurch ein Drag-and-Drop initiiert ist, wird in der Methode entschieden. Falls ja, wird die Methode startDrag() in dem DragGestureEvent-Exemplar aufgerufen. Hierbei gibt es verschiedene Signaturen. Pflicht ist die Angabe eines Cursors (aufgrund des Bugs #4407521 bei den Java Versionen 1.3.1 und 1.4 sollte der Wert hier null sein) und des Transferable, welches die Daten enthält. Zusätzlich kann eine Grafik angegeben werden, die beim Drag-and-Drop angezeigt wird , und ein DragSourceListener. Es ist zu beachten, dass Windows keine eigenen Grafiken unterstützt.

DragGestureListener dragGestureListener =
new DragGestureListener() {
public void dragGestureRecognized(
DragGestureEvent e) {
// Der Text des Label soll
// JVM-intern
// übertragen werden
StringSelection selection =
new StringSelection(
label.getText());
e.startDrag(null, selection, selection);
}
};
DragSource dragSource = new DragSource();
DragGestureRecognizer dgr =
dragSource.createDefaultDragGestureRecognizer(
label,
DnDConstants.ACTION_COPY,
dragGestureListener);

java.awt.dnd.DragSourceListener

Über das Interface DragSourceListener kann die Quelle eines Drag-and-Drop-Vorganges über den Verlauf informiert werden. Dies ist besonders dann interessant, wenn nach einem erfolgreichen Drag-and-Drop-Vorgang das verschobene Objekt gelöscht werden muss.

Hierzu wird die Methode dragDropEnd(DragSourceDropEvent e) benutzt, die aufgerufen wird, wenn ein Drag-and-Drop beendet wurde. Wurden beispielsweise Dateien verschoben, so werden diese durch folgenden Code gelöscht:

public void dragDropEnd (DragSourceDropEvent e) {
if (e.getDropSuccess() &&
e.getDropAction() == DnDConstants.ACTION_MOVE) {
Transferable tr = e.getDragSourceContext().
getTransferable();
DataFlavor[] flavors = tr.getTransferDataFlavors();
for (int i = 0; i < flavors.length; i++)
if (flavors.isFlavorJavaFileListType())
try {
List files = (List) tr.getTransferData(flavors);
for (int j = 0; j < files.size (); j++)
((File) files.get(j)).delete();
} catch (Throwable t) { t.printStackTrace (); }
}
}

java.awt.dnd.Autoscroll

Wenn die Zielkomponente in einem JScrollPane liegt und dann der Mauszeiger an den Rand des sichtbaren Bereiches stößt, möchte man meist, dass der dabei bisher verdeckte Bereich sichtbar gemacht wird. Zu diesem Zweck muss die entsprechende Komponente das Interface Autoscroll implementieren. Eine zusätzliche Registrierung der Komponente ist hierbei nicht nötig.

Seit der Version [1.4]1.4 kann man bei Swing-Komponenten dafür die Methode setAutoscrolls(boolean flag) benutzen.

Vor der Version 1.4 wird dafür das Interface Autoscroll benötigt. Dieses definiert zwei Methoden:

* public void autoscroll(Point cursorLocation)
Wird aufgerufen, wenn der Mauszeiger während eines Drag-Vorgangs in den Scrollbereich kommt, den die Methode getAutoscrollInsets() definiert.
* public Insets getAutoscrollInsets()
Definiert die Grenzen des Bereiches innerhalb der Komponente, bei der kein Scrolling vonnöten ist. Ist der Mauszeiger außerhalb dieser Grenzen, wird die Methode autoscroll() aufgerufen.

 
Status
Nicht offen für weitere Antworten.
Ä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
E Drag&Drop zwischen 2 Listen AWT, Swing, JavaFX & SWT 5
G Drag&Drop zwischen JTables AWT, Swing, JavaFX & SWT 2
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