jTable drag & drop einzelner Zeilen

Lirave

Aktives Mitglied
Hallo,

wie im Titel beschrieben, würde ich gerne für meine beiden Tabelle drag&drop einzellner Zeilen aktivieren.
Ich habe gegoogelt und dabei eine Lösung gefunden (die ich nicht verstehe).
Eclipse hat sie ersteinmal angenommen, beim Versuch eine Zeile zu verschieben erhalte ich dann folgende Fehlermeldung:

java.lang.ClassCastException: medikit.view.Table$1 cannot be cast to medikit.view.Table$Reorderable
at medikit.view.TableRowTransferHandler.importData(TableRowTransferHandler.java:58)
at javax.swing.TransferHandler$DropHandler.drop(Unknown Source)
at java.awt.dnd.DropTarget.drop(Unknown Source)
at javax.swing.TransferHandler$SwingDropTarget.drop(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer.processDropMessage(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchDropEvent(Unknown Source)
at sun.awt.dnd.SunDropTargetContextPeer$EventDispatcher.dispatchEvent(Unknown Source)
at sun.awt.dnd.SunDropTargetEvent.dispatch(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processDropTargetEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Java:
package medikit.view;

import java.util.Arrays;
import java.util.Vector;

import javax.swing.DropMode;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;





public class Table {	

	private JTable table;
	private DefaultTableModel model;
	
	
	public Table(Vector<?> content,Vector<?> headercont,int[] isNotEditAble,int[][] prefMinMaxWidth, Class<?>[] classtype) {
		table = new JTable();
		initTable(content,headercont,isNotEditAble,prefMinMaxWidth,classtype);
	}	
	
	
	@SuppressWarnings("serial")
	private void initTable(Vector<?> content , Vector<?> headercont,final int[] isNotEditAble,int[][] prefMinMaxWidth,final Class<?>[] classtype) {
		table.setModel(model = new DefaultTableModel(content,headercont) {			
			
			public boolean isCellEditable(int row, int column) {
				Arrays.sort(isNotEditAble);
				if (Arrays.binarySearch(isNotEditAble, column) > -1)
					return false;
				return true;
				}
			
			public Class<?> getColumnClass(int column)	{
				return classtype[column];
				}
			});
		
		for (int i=0; i<prefMinMaxWidth.length; i++) {
			table.getColumnModel().getColumn(i).setPreferredWidth(prefMinMaxWidth[i][0]);
			table.getColumnModel().getColumn(i).setMinWidth(prefMinMaxWidth[i][1]);
			table.getColumnModel().getColumn(i).setMaxWidth(prefMinMaxWidth[i][2]);
		}		
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		[COLOR="Blue"]table.setDragEnabled(true);
		table.setDropMode(DropMode.INSERT_ROWS);
		table.setTransferHandler(new TableRowTransferHandler(table));[/COLOR]
		
		JTableHeader header = table.getTableHeader();
	    ((DefaultTableCellRenderer)header.getDefaultRenderer()).setHorizontalAlignment(JLabel.CENTER);    
	    header.setReorderingAllowed(false);	    
	        
	}
	
	public JTable getTable() {
		return table;		
	}
	public DefaultTableModel getModel() {
		return model;		
	}
	
	public interface Reorderable {
		public void reorder(int fromIndex, int toIndex);
	}
}

Java:
package medikit.view;

import java.awt.Cursor;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DragSource;

import javax.activation.ActivationDataFlavor;
import javax.activation.DataHandler;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;

import medikit.view.Table.Reorderable;

/**
 * Handles drag & drop row reordering
 */
@SuppressWarnings("serial")
public class TableRowTransferHandler extends TransferHandler {
   private final DataFlavor localObjectFlavor = new ActivationDataFlavor(Integer.class, DataFlavor.javaJVMLocalObjectMimeType, "Integer Row Index");
   private JTable           table             = null;

   public TableRowTransferHandler(JTable table) {
      this.table = table;
   }

   @Override
   protected Transferable createTransferable(JComponent c) {
      assert (c == table);
      return new DataHandler(new Integer(table.getSelectedRow()), localObjectFlavor.getMimeType());
   }

   @Override
   public boolean canImport(TransferHandler.TransferSupport info) {
      boolean b = info.getComponent() == table && info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
      table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop);
      return b;
   }

   @Override
   public int getSourceActions(JComponent c) {
      return TransferHandler.COPY_OR_MOVE;
   }

   @Override
   public boolean importData(TransferHandler.TransferSupport info) {
      JTable target = (JTable) info.getComponent();
      JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation();
      int index = dl.getRow();
      int max = table.getModel().getRowCount();
      if (index < 0 || index > max)
         index = max;
      target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
      try {
         Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor);
         if (rowFrom != -1 && rowFrom != index) {
            ((Reorderable)table.getModel()).reorder(rowFrom, index);
            if (index > rowFrom)
               index--;
            target.getSelectionModel().addSelectionInterval(index, index);
            return true;
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
      return false;
   }

   @Override
   protected void exportDone(JComponent c, Transferable t, int act) {
      if (act == TransferHandler.MOVE) {
         table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
      }
   }

}


Eine Tabelle initialisiere ich z.B. mittels
Java:
vLager = new Vector<Object> ( Arrays.asList( null, null,null, null, null, null, null, null, null,null, null, null, null, null, null, null,null, null, null, null, null, null, null, null));
tableLager = new Table(vLager,
         new Vector<String> ( Arrays.asList("Medikament", "Wirkstoff", "Dosis", "Anz./Packung", "ges. Stückzahl", "verbraucht bis")),
         new int[] {5},
         new int[][] {{120,80,500},{110,58,500},{58,43,500},{85,85,500},{92,92,500},{90,90,500}},
         new Class[] {String.class,String.class,String.class,Integer.class,Double.class,String.class}
		);

Mit freundlichen Grüßen
Lirave
 
Zuletzt bearbeitet von einem Moderator:

KrokoDiehl

Top Contributor
Wie die Exception schon sagt (aber danke dass du sie gepostet hast!) ist das Problem der Cast in Zeile 58:
Java:
        ((Reorderable)table.getModel()).reorder(rowFrom, index);

Dein Interface Reorderable wird nicht von Table implementiert, bzw. nicht vom Tabellenmodell. Die Idee deiner Quelle ist nämlich folgende:

- D&D zu erlauben heißt dass man an beliebiger Stelle in der Tabelle, respektive im Tabellenmodell, Daten einfügen kann.
- Bei diesem Einfügen muss das Tabellenmodell re-organisiert werden, d.h. es müssen z.B. alle Zeilen nach der neu eingefügten nach hinten verschoben werden.
- Das Re-organisieren wird in dem genannten Interface abstrahiert. Es muss also (von dir) implementiert werden.

Ok, um ehrlich zu sein ist dein direktes Problem natürlich dass du nicht verstehst, was hier geschieht ;) Daher ist es natürlich ratsam mit Tabellen und Tabellenmodellen zu beginnen denn letztlich müssen die Daten entsprechend im Modell eingefügt/geändert werden, die Tabelle (JTable) dient nur zur Anzeige. Drag&Drop empfinde ich auch schon ein komplexeres Thema...

Die Lösung müsste wie folgt aussehen: Deine Klasse Table muss in ihrer Methode
Code:
getModel()
etwas zurückgeben, dass Reorderable implementiert und in diesem Etwas musst du die Methode
Code:
reorder()
derart programmieren, dass sie dein Tabellenmodell entsprechend ändert.
 

Lirave

Aktives Mitglied
Hallo,

ich komme nicht darauf, wo ich jetzt in meiner Datei Table.java nun das Reorderable Interface implementieren kann. Was ich da drin machen muss ist mir glaube ich klar.

Wäre nett wenn Ihr die Stelle in dem Quelltext oben markieren könntet.

Danke
 

KrokoDiehl

Top Contributor
In der Zeile
Java:
((Reorderable)table.getModel()).reorder(rowFrom, index);
wird folgendes gemacht:

Am Objekt table - das ist die JTable die dem Transferhandler im Konstrutkor übergeben wird - wird die Methode
Code:
getModel()
aufgerufen. Die liefert das Modell der Tabelle zurück. Das ist in
Code:
Table.initTable()
eine interne Klasse DefaultTableModel.
In der o.g. Zeile wird dieses DefaultTableModel aber zum Reorderable gecastet und das geht nicht, weil es das nicht implementiert.
 

Lirave

Aktives Mitglied
Das heißt also, ich muss mir ein eigenes TableModel erstellen, dass das DefaultTableModel implementiert und die Funktion Reorderable. Richtig ?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
H Swing JTextArea als TableCellRenderer in JTable - wie Zeilen selektieren? Allgemeine Java-Themen 47
D JTable mit JTextAreas in den Zellen Allgemeine Java-Themen 8
X Swing JTable zeigt nichts Allgemeine Java-Themen 4
G jTable aktualisieren?! Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
V JTable Externe Lib Allgemeine Java-Themen 2
F JTable Pfeiltasten-Verhalten Allgemeine Java-Themen 1
T jTable Gestaffelte Überschriften Allgemeine Java-Themen 22
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
A JTable Bilder Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
A JTable - CellRange auslesen Allgemeine Java-Themen 2
A jTable Renderer Allgemeine Java-Themen 5
N JTable filtern Allgemeine Java-Themen 3
hdi JTable#print & Druckgröße Allgemeine Java-Themen 6
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
G JTable: ListSelectionListener removen Allgemeine Java-Themen 8
M JTable + ArrayList Allgemeine Java-Themen 3
G Aktualisierung einer JTable erfolgt nicht zuverlässig Allgemeine Java-Themen 14
E Hintergrund einer JTable änden Allgemeine Java-Themen 2
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
P jTable getSelectedRow? Allgemeine Java-Themen 2
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
X xml aus Zip in JTable Allgemeine Java-Themen 2
S JTable und Spalten löschen Frage Allgemeine Java-Themen 5
H JTable per iText in PDF: Größenanpassung möglich? Allgemeine Java-Themen 2
F XML zu JTable mit JDOM Allgemeine Java-Themen 2
E JTable wird nicht angezeigt Allgemeine Java-Themen 11
Screen ImageIcon in Cell der JTable Allgemeine Java-Themen 2
G JTable mit Keylistener geht nicht Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
A Swing JTable Polymorphismus Allgemeine Java-Themen 2
trash super + JTable Allgemeine Java-Themen 7
D JTable -> 1Spalte nur zahlen Allgemeine Java-Themen 2
L JTABLE setvalueat methode! Allgemeine Java-Themen 16
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
hdi JTable: Sortierung von Date-Objekten Allgemeine Java-Themen 4
B JTable nach Icon sortieren Allgemeine Java-Themen 6
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
M jdesktop binding: jTable update nach Änderung... Allgemeine Java-Themen 3
D JTable mit GROUP BY Allgemeine Java-Themen 23
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
P JTable drucken Allgemeine Java-Themen 8
A JTable Feldwerte in JTextFelder mit blättern Allgemeine Java-Themen 5
DStrohma [Erledigt] Wieso kann ich Taste 'ENTER' in JTable nicht belegen? Allgemeine Java-Themen 2
M jTable Allgemeine Java-Themen 19
D jTable und TableModel Allgemeine Java-Themen 2
B Exception bei leerem JTable verhindern Allgemeine Java-Themen 10
A Observable BeansBinding an einer JTable bzw. JXTable Allgemeine Java-Themen 3
P Textfile -> Array -> JTable Allgemeine Java-Themen 9
S JTable Aktuelisieren ber Wie ? Allgemeine Java-Themen 4
MQue JComboBox in JTable Allgemeine Java-Themen 4
J Ergebnismenge eines SQL-Queries in JTable anzeigen Allgemeine Java-Themen 3
MQue JTable alles rechts Allgemeine Java-Themen 8
G Checkboxen abfragen,Auswahl sichern, JTable laden Allgemeine Java-Themen 2
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
R JTable und Cell Renderer Allgemeine Java-Themen 3
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
S Welche Speicherung von Daten bei Kalendarfunktion der jtable Allgemeine Java-Themen 7
J keylistener auf jtable Allgemeine Java-Themen 19
C JTable, Abstand zwischen Zellen Allgemeine Java-Themen 2
G Eindeutiges Identifizieren einer JTable/Component z.laufzeit Allgemeine Java-Themen 2
D JTable -> ArrayIndexOutOfBoundsException bei Mausklick Allgemeine Java-Themen 2
S JTable editieren + in JTextField schreiben Allgemeine Java-Themen 7
G Daten in / für JTable beim Scrollen nachladen? Allgemeine Java-Themen 5
M JTable verändert Position auf meinem JPanel Allgemeine Java-Themen 3
P JTable Allgemeine Java-Themen 2
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
P JTable setDataVector Allgemeine Java-Themen 2
D Scrollbalken in meiner JTable auf einmal weg. Allgemeine Java-Themen 2
P JTable Allgemeine Java-Themen 8
P JButtons mit JTable verknüpfen Allgemeine Java-Themen 16
G fehler bei JTable mit JDK1.6 Allgemeine Java-Themen 4
M CheckBox in JTable - ich verzweifle gleich Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
P JTable Allgemeine Java-Themen 4
E JButton bleibt in der JTable Allgemeine Java-Themen 2
E JButton in einer Zelle von JTable Allgemeine Java-Themen 16
P JTable selektierte Zeile mitwandern Allgemeine Java-Themen 2
F Checkbox in JTable , eigener Cellrenderer -wie gehts weiter? Allgemeine Java-Themen 2
P JTable suchen in einer Spalte Allgemeine Java-Themen 24
G JTable wird nicht richtig aufgebaut Allgemeine Java-Themen 9
C Ausdrucken einer JTable in eine Datei mit Erhalt des Formats Allgemeine Java-Themen 3
W Columns austauschen/verschieben von jtable Allgemeine Java-Themen 3
P 3rd party JTable libraries (freeware/opensource) Allgemeine Java-Themen 19
D JTable aus Eclipse Ok, kompeliert aber nicht Allgemeine Java-Themen 6
G mySQL und JTable Allgemeine Java-Themen 7
D JTable und Buttons Allgemeine Java-Themen 16
B JScrollPane in einer JTable aktualisieren? Allgemeine Java-Themen 9
G CheckBox in JTable Allgemeine Java-Themen 3
S JTable erzeugen und updaten Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben