SWT Drag&Drop / Table

Status
Nicht offen für weitere Antworten.

sutcha

Bekanntes Mitglied
Hallo,

ich versuche eine Tabelle dynamisch zu erstellen.
Wenn ich zB 4 Objekte (Buttons, Labels) habe, soll die Tabelle 4 Zeilen und 4 Reihen haben. In der 1. Zeile sollen die Objekte stehen (diese will ich auch dynamisch erzeugen). Jetzt will ich diese Objekte in der Tabelle per Drag&Drop verschieben können. Anschließend will ich die aktuelle Position auslesen (zB 2. Spalte, Reihe 3).

Wie ich einfach Labels in eine Tabelle zieh, weiß ich. Allerdings habe ich keine Erfahrung mit dynamischen Erzeugen von Objekten. Bisher scheitere ich schon an der Erzeugung der Spalten :(
Kann man Opjekte nur mit Hilfe von einer Liste dynamisch erzeugen? Also immer ein Objekt instanzieren und dann der Liste hinzufügen?
Drag&Drop bei dem die Source gleichzeitig auch das Target ist, funktioniert das? Ich habe ein bisschen rumprobiert, bin aber nicht wirklich vorangekommen.
Ich wäre sehr dankbar, wenn mir jemand helfen könnte! gegoogelt habe ich schon, aber bisher nichts brauchbares gefunden.

Vielen Dank schonmal!

Gruß

sutcha
 

sutcha

Bekanntes Mitglied
Code:
for (int j = 0; j < 2; j++) {
				TableColumn column = new TableColumn(table, SWT.NONE);
				column.setWidth(50);
			    
				for (int i = 0; i < 3; i++) {
					TableItem item = new TableItem(table, SWT.NONE);
					item.setText(j,"Position "+i);
				}
			}

So erzeuge ich meine Tabelle, die 2 Spalten und 3 Zeilen haben soll.
Wenn ich mich nicht irre, sollte doch in der 1. Zeile Position 0 | Position 0 stehen, also in beiden Spalten das gleiche.
bei mir kommt aber:
Pos 0 |
Pos 1 |
Pos 2 |
| Pos 0
| Pos 1
| Pos 2

Die rechte Spalte hat meiner Meinung nach die falschen Indices (3-5 statt 0-2)

Ich kann dem TableItem auch den Index übergeben, also hier das "i", aber dann kommt das gleiche wie oben nur spiegelverkehrt.
Was mache ich falsch?
 

sutcha

Bekanntes Mitglied
Code:
DragSource source = null;
			table = new Table(bildschirmComposite,SWT.BORDER);
			table.setLinesVisible(true);
					
			
		    for (int j = 0; j < 2; j++) {
				TableColumn column = new TableColumn(table, SWT.NONE);
				column.setWidth(50);
			    
				for (int i = 0; i < 3; i++) {
					TableItem item = new TableItem(table, SWT.NONE);
					item.setText(j,"Position "+i);
				}
			}
			
			
			source = new DragSource(table, DND.DROP_MOVE);
			Transfer[] types = new Transfer[] {TextTransfer.getInstance()};
			source.setTransfer(types);
			
			source.addDragListener(new DragSourceAdapter() {
				public void dragSetData(DragSourceEvent event) {
					DragSource ds = (DragSource) event.widget;
					Table table = (Table)ds.getControl();
					TableItem[] selection = table.getSelection();
					
					StringBuffer buff = new StringBuffer();
					for (int i = 0, n = selection.length; i < n; i++) {
						buff.append(selection[i].getText());
					}
					
					event.data = buff.toString();
				}
			});
			
			
			
			DropTarget target = new DropTarget(table, DND.DROP_MOVE);
		    target.setTransfer(types);
		    target.addDropListener(new DropTargetAdapter() {
		      public void dragEnter(DropTargetEvent event) {
		        
		    	// Allow dropping text only
		        for (int i = 0, n = event.dataTypes.length; i < n; i++) {
		          if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
		            event.currentDataType = event.dataTypes[i];
		          }
		        }
		      }

		      public void dragOver(DropTargetEvent event) {
		         event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
		      }
		      public void drop(DropTargetEvent event) {
		        if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
		          // Get the dropped data
		          DropTarget target = (DropTarget) event.widget;
		          Table table = (Table) target.getControl();
		          String data = (String) event.data;

		          // Create a new item in the table to hold the dropped data
		          TableItem item = new TableItem(table, SWT.NONE);
		          item.setText(new String[] { data });
		          table.redraw();
		        }
		      }
		    });

Das ist der gesamte Code für meine Drag&Drop Table.
Ich kann nur von Spalte 1 etwas nehmen und kann es auch nur dorthin droppen. Ich möchte es aber verschieben können, momentan wird eine Kopie gedropt und es wird auch nicht an der gewünschten Stelle gedroppt sondern immer als unterstes Item der Tabellenspalte.
Kennt sich denn niemand in dem Bereich aus? :(

Ich verzweifel langsam
 

sutcha

Bekanntes Mitglied
Wie finde ich heraus, welche Source wo gedroppt wurde?
Ich habe mir sonst überlegt, eine Tabelle mit Labels zu füllen und jedem Label dann einen Listener hinzuzufügen. Das gleiche mache ich mit der Source, jede Source wird extra definiert. Die Source ist aber nichtmehr in der Tabelle, sondern als Label oben drüber oder so.
Dann sollte ich die Source in jedes Target ziehen können. Wenns erfolgreich war, wird die Source gelöscht, dh. der Text = "". Nur muss ich dann wissen, in welches Target die Source gekommen ist, damit ich eine Position im Koordinaten-System habe (Reihe, Spalte).
Funktionieren sollte es so, was meint ihr?
 

metaltiffy

Mitglied
Vielleicht kann man das mit einem Cursor machen

Code:
item1.setText(i - 1, rs.getString(i));
		Cursor cursor = new TableCursor(table, SWT.NONE);	
					cursor.addSelectionListener(new SelectionAdapter() {
						public void widgetSelected(SelectionEvent e) {
							table.setSelection(new TableItem[] {cursor.getRow()});
							TableItem row = cursor.getRow();
							String string = (row.getText(0));
							dat_id = Integer.parseInt(string);
													}
						public void widgetDefaultSelected(SelectionEvent e){
							TableItem row = cursor.getRow();
							String string = (row.getText(0));
							dat_id = Integer.parseInt(string);//id aus 1. Spalte holen
													}
					});

So gibts du jedem Item in der Table einen Cursor, der merkt wenn er markiert wurde...
mit String string = (row.getText(0)); holst du dir zum Beispiel den eintrag aus der 1. Spalte in der markierten Zeile...
Theoretisch könnte man mit nem index ja jeden Wert nehmen...

Vielleicht hilft dir das ja ein bisschen
 

sutcha

Bekanntes Mitglied
Mit meinem og Code hab ich momentan das Problem, das die Source nicht gelöscht wird. D.h. der Wert wird nur kopiert. Mit deinem Cursor müsste ich quasi den Wert des Feldes, den ich verschieben will, in dem Moment auf "" setzen, sobald er im Ziel-Feld eingetragen wurde.
Ich bin gerade am überlegen, wie ich das mit dem Cursor am besten mache.
Meine Überlegung war, eine Liste mit Labels zu machen und dann einfach die Liste durchlaufen, bis der Wert des Labels den gewünschten Wert (der des verschobenen Labels) hat. Ein Zähler läuft dabei mit und dann kann ich an Hand der Spalten-Anzahl die genaue Position errechnen.
Zähler: 5, Spalten: 3 -> Wert befindet sich in der 2. Zeile, 2. Spalte.

Aber das Problem, das die Source nicht gelöscht wird bzw nicht "" gesetzt wird, ist noch das gleiche.

Vielen Dank für deinen Tipp, werde da mal paar Sachen versuchen ;)
 

sutcha

Bekanntes Mitglied
Code:
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
	    DragSource ds = new DragSource(table, DND.DROP_MOVE);
	    ds.setTransfer(types);
	    
	    ds.addDragListener(new DragSourceAdapter() {
	      public void dragSetData(DragSourceEvent event) {
	        // Get the selected items in the drag source
	        DragSource ds = (DragSource) event.widget;
	        Table table = (Table) ds.getControl();
	        TableItem[] selection = table.getSelection();

	        StringBuffer buff = new StringBuffer();
	        for (int i = 0, n = selection.length; i < n; i++) {
	          buff.append(selection[i].getText());
	        }
	        event.data = table.getItem(table.getSelectionIndex()).getText(); 
	      }
	    });
	    
	    DropTarget dt = new DropTarget(table, DND.DROP_MOVE);
		dt.setTransfer(new Transfer[] { TextTransfer.getInstance() });
	    dt.addDropListener(new DropTargetAdapter() {
	      public void dragEnter(DropTargetEvent event) {

	        for (int i = 0, n = event.dataTypes.length; i < n; i++) {
	          if (TextTransfer.getInstance().isSupportedType(event.dataTypes[i])) {
	            event.currentDataType = event.dataTypes[i];
	          }
	        }
	      }

	      public void dragOver(DropTargetEvent event) {
	          event.detail = DND.DROP_NONE;
	          TableItem item = (TableItem) event.item;
	          if (item == null)
	            return;
	          if (item.getText() == "") {
	              event.detail = DND.DROP_MOVE;
	            } 
	      }

	      public void drop(DropTargetEvent event) {
	        if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
	          
	          DropTarget target = (DropTarget) event.widget;
	          final Table table = (Table) target.getControl();
	          String data = (String) event.data;
	          TableItem item = (TableItem) event.item;
	          item.setText(data);
	          table.getItem(table.getSelectionIndex()).setText("");
	          table.redraw();
	        }
	      }
	      
	    });

So schauen momentan die Drag&Drop-Listener und Events aus.

Problem: Ich kann die Source und das Target nur innerhalb der 1. Spalte wählen.

Ich habe als Target und als Source die gesamte Table gewählt, warum geht dann nur die 1. Spalte?
Kann mir das jemand erklären?
 

sutcha

Bekanntes Mitglied
Vielleicht liegts an der Table?
Code:
 for (int j = 0; j < size; j++) {
			column = new TableColumn(table, SWT.NONE);
		}
	    	
	    for (int i = 0; i < size; i++) {
	    	item = new TableItem(table, SWT.NONE);
	    		for (int k = 0; k < size; k++){
	    			if (i == 0)
	    				item.setText(k,meter.get(k));
	    			else
	    				item.setText(k,"");
	    		}
	    		table.getColumn (i).pack ();	
	    }

Die erste Reihe der Tabelle wird mit einem Wert aus einer Liste gefüllt, alle weiteren Reihen mit "". size ist die Größe der Liste und die Tabelle soll x-Spalten und x-Zeilen haben,wobei x=size.

Ansonsten finde ich keinen Fehler, bei der Source bzw Target-Definition...
 

sutcha

Bekanntes Mitglied
Kann mir niemand helfen?
Ich find einfach nicht, woran das liegen kann. Nur die 1. Spalte kann verwendet werden. Das ist doch nicht normal oder doch? Man muss doch die ganze Tabelle benutzen können.
 

java_joe

Neues Mitglied
mhhh komisch....ja TableItem ist sehr komplex und schwierig die Source raus zu finden. wir haben auch die selbe Problemstellung
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
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
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
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
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
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
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
E Drag&Drop zwischen 2 Listen 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
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
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
G Drag and Drop mal wieder? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben