Swing DnD: Wie finde ich heraus, von welcher Zelle aus im JTable der Drag gestartet wurde?

Status
Nicht offen für weitere Antworten.

strangequark

Mitglied
Hallo

Ich implementiere gerade ein Drag'n'Drop auf einem JTable. Dabei sollen allerdings nur best. Zellen auf best. andere Zellen gedroppt werden können. Letzteres ist nicht so das Problem, weil ich in canImport() herausfinden kann um welches target es sich handelt (da krieg ich vom TransferSupport die Zelle).

Allerdings muss ich auch die source kennen, um entscheiden zu können, ob der Drag unterstützt wird.

Hier die Lösung, die ich mir überlegt habe, allerdings funktioniert es nicht zuverlässig, weil rowAtPoint(Point p) und rolumnAtPoint(Point p) zu spät aufgerufen zu werden scheinen.

Also grundsätzlich geht es um folgendes: Ich will nur von best. Zellen aus den Drag starten, wie geht das?

[Java]
import java.awt.Point;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;

import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;

public class Test {
private static void createGui() {
JFrame jf = new JFrame("Test");
jf.setSize(400, 200);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);

Integer[][] data = {{1,2,3},{4,5,6},{7,8,9}};

JTable jt = new JTable(data, new String[] {"A", "B", "C"});
jt.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jt.setDragEnabled(true);
jt.setDropMode(DropMode.ON);
jt.setTransferHandler(new TransferHandler() {
public int getSourceActions(JComponent c) {
JTable table = (JTable) c;
Point p = table.getMousePosition();
int row = table.rowAtPoint(p);
int column = table.columnAtPoint(p);
// example check, if source is allowed (in this case only even cells)
if ((Integer) table.getValueAt(row, column) % 2 == 0)
return LINK;
return NONE;
}

protected Transferable createTransferable(JComponent c) {
return new StringSelection(null);
}

public boolean canImport(TransferSupport supp) {
return true;
}

public boolean importData(TransferSupport supp) {
return true;
}
});

jf.getContentPane().add(jt);
jf.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGui();
}
});
}
}
[/Java]

Wenn ihr das ausprobiert, seht ihr, dass es manchmal geht und manchmal nicht (da scheint Point null zu sein). D.h. ich krieg einfach nicht immer die richtige Zelle zurück. Oder ist der Ansatz generell falsch?

Vielen Dank für eure Hilfe.

lg,
uli
 
Zuletzt bearbeitet:

hdi

Top Contributor
Ich will nur von best. Zellen aus den Drag starten, wie geht das?

Du musst dir eigene MouseListener für den Header basteln, die auf den Default-Listener basieren, und dann anpassen, was du möchtest.

In deiner JTable-Klasse:
Java:
	/* install header listener */
		for (MouseListener ml : getTableHeader().getMouseListeners()) {
			if (ml instanceof BasicTableHeaderUI.MouseInputHandler) {
				getTableHeader().removeMouseListener(ml);
				MyHeaderListener headerListener = new MyHeaderListener(this, ml);
				getTableHeader().addMouseListener(headerListener);
				getTableHeader().addMouseMotionListener(headerListener);
				break;
			}
		}

Java:
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class MyHeaderListener implements MouseListener, MouseMotionListener {

	private MyTable table;
	private MouseListener original;
	private MouseMotionListener originalMotion;

	public MyHeaderListener(MyTable table, MouseListener m) {
		this.table = table;
		original = m;
		originalMotion = (MouseMotionListener) m;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		original.mouseClicked(e);
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		original.mouseEntered(e);
	}

	@Override
	public void mouseExited(MouseEvent e) {
		original.mouseExited(e);
	}

	@Override
	public void mousePressed(MouseEvent e) {
		original.mousePressed(e);
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		original.mouseReleased(e);
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		originalMotion.mouseDragged(e);
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		originalMotion.mouseMoved(e);
	}

}

Also einfach die Methoden jetzt so implementieren wie du willst.
In deinem Fall wäre das wohl mouseDragged, wenn sie aufgerufen wird prüfst du welche Spalte du grad hast, und wenn man von dort aus nicht draggen können soll, dann macht die Methode halt nix, ansonsten ruft sie die Logik von dem default-Listener auf.
 

strangequark

Mitglied
Ich muss aber dein erstes Code-Fragment für die Listener des jtables und nicht für die listener des headers des tables ausführen? Ansonsten ergibt das glaub ich keinen Sinn. Jedenfalls funktioniert deine Lösung nicht, denn die Methoden werden nie ausgeführt. Trotzdem danke. :)

Ich habe mal geschaut, wer getSourceActions() aufruft. Das ist die private Klasse "Handler" in BasicTableUI.
 

hdi

Top Contributor
Achso sry hab nicht mitbekommen dass es hier um Zellen geht :D Dafür gibt es ja sowieso keine Standard-Implementation soweit ich weiss, oder? Ich meine das Drag and Drop musst du ja selber geschrieben haben, oder aus irgendeinem Framework. Die API bietet sowas ja nicht, oder doch?

...naja also dann kann ich dir jetzt leider nicht weiterhelfen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Wie finde ich den Pfad eines ImageIcons heraus? AWT, Swing, JavaFX & SWT 8
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
M JavaFX Wo finde ich den Scene Builder? AWT, Swing, JavaFX & SWT 3
Z Java Draw -JFrame finde nicht die Mitte & höhe, breite AWT, Swing, JavaFX & SWT 7
Z GUI-Problem, finde meinen Fehler nicht! AWT, Swing, JavaFX & SWT 11
M Swing finde den fehler nicht AWT, Swing, JavaFX & SWT 9
K mehrere JTextFields - wie finde ich die Cursor-Position? AWT, Swing, JavaFX & SWT 5
F Swing J(X)Table Spalten umsortieren NUR im View (Wie finde ich eine Spalte nach Name?) AWT, Swing, JavaFX & SWT 3
S Um Insets erweiteter BorderLayoutManager oder "Wo finde ich den Quellcode?" AWT, Swing, JavaFX & SWT 2
P finde den Fehler im JTable nicht AWT, Swing, JavaFX & SWT 2
B Finde kein PrintService der das Attribut PageRanges annimmt AWT, Swing, JavaFX & SWT 22
G Wo finde ich Icons zum runterladen AWT, Swing, JavaFX & SWT 3
D Wo finde ich Informationen zu Swing AWT, Swing, JavaFX & SWT 2
clemson Finde den Fehler nicht AWT, Swing, JavaFX & SWT 7
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
D Robot Programm mit Escape abbrechen (aus Eclipse heraus) AWT, Swing, JavaFX & SWT 2
F JPanel aus sich selbst heraus ersetzen. AWT, Swing, JavaFX & SWT 9
P JLabel Farbe/Bild ändern aus MouseListener heraus AWT, Swing, JavaFX & SWT 3
A Zeichnen auf JFrame aus anderer class heraus AWT, Swing, JavaFX & SWT 12
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
U JTable in einem Tab aktualisieren aus anderem Tab heraus initiiert AWT, Swing, JavaFX & SWT 4
R Korrektes manipulieren der GUI aus anderen Threads heraus AWT, Swing, JavaFX & SWT 19
isowiz Wie kann ich Variablen aus einer Innerklasse heraus ändern? AWT, Swing, JavaFX & SWT 5
G JTable aus Thread heraus updaten AWT, Swing, JavaFX & SWT 3
F JTextArea aus einer anderen Klasse heraus verändern AWT, Swing, JavaFX & SWT 4
O Anwendung aus dem Programm heraus neu starten AWT, Swing, JavaFX & SWT 2
D Element aus einer Methode heraus hinzufügen AWT, Swing, JavaFX & SWT 2
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
dereki2000 Welcher Methodenaufruf bei Hover, click,... AWT, Swing, JavaFX & SWT 5
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
Z Swing Welcher Layoutmanager bei ScrollPane? AWT, Swing, JavaFX & SWT 4
N Welcher LayoutManager AWT, Swing, JavaFX & SWT 16
G Welcher Teil der Java Standard Edition API ist für das Zeichnen von einfachen Grafiken gedacht? AWT, Swing, JavaFX & SWT 3
SexyPenny90 Welcher LayoutManager erfüllt meine Bedingung AWT, Swing, JavaFX & SWT 7
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
P LayoutManager welcher LM ist der richtige? AWT, Swing, JavaFX & SWT 3
A Welcher Layout Manager ist hier richtig? AWT, Swing, JavaFX & SWT 3
S LayoutManager Welcher Manager AWT, Swing, JavaFX & SWT 2
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
M Swing Bild wird nie angezeigt, egal mit welcher Methode! AWT, Swing, JavaFX & SWT 10
C Abfragen welcher Tab aktiv ist? AWT, Swing, JavaFX & SWT 2
V Welcher Listener für JTable? AWT, Swing, JavaFX & SWT 3
A JToolBar: Welcher Button wurde gedrückt? AWT, Swing, JavaFX & SWT 5
G welcher Jtogglebutton geklickt? AWT, Swing, JavaFX & SWT 3
S Welcher Listener ? In JTable mehrere Zeilen markieren & AWT, Swing, JavaFX & SWT 2
J jTable, welcher listener für Änderung der Spaltenbreite AWT, Swing, JavaFX & SWT 2
M Welcher Listener für JLabel? AWT, Swing, JavaFX & SWT 4
M Welcher Layout Manager? AWT, Swing, JavaFX & SWT 5
M Ein Chatfenster mit Emoticons etc.mit welcher Komponente? AWT, Swing, JavaFX & SWT 10
T JTextArea, in welcher Zeile befindet sich der Cursor AWT, Swing, JavaFX & SWT 25
J Welcher Layoutmanager? AWT, Swing, JavaFX & SWT 20

Ähnliche Java Themen

Neue Themen


Oben