# Table Row per Drag and Drop in andere Table schieben?



## Steve Wonder (3. Jul 2008)

Hallo,

Ich hab jetzt shcon etwas länger im Netz geschaut, aber verstädliche Infos hab ich nicht gefunden. Nun bin ich hier gelandet und hoffe, dass mir jemand helfen kann.

Ich habe zwei JTables und möchte eine Row von der einen in die andere schieben. Gibt es da keine "einfache" Lösunf. Ich bin relativ unerfahren mit Java und möchte eigentlich nur dass das funktioniert. Ohne die ganze Spezifikation auswendig lernen zu müsssen.

in C# ist das ein 5-Zeiler....

In der Forensuche habe ich ein Beispiel gefunden, aber da fehlt ene Klasse "ListDNDTest"....

Ich hoffe mir kann jemand auf die Sprünge helfen. 


Danke


----------



## Kaladial (3. Jul 2008)

also ich hab das so gemacht:


```
package AVS3;

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class DlgUserGrpVerwaltung extends JDialog {
    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JPanel jPanelUser = null;
    private JPanel jPanelGruppe = null;
    private JPanel jPanelSouth = null;
    private JButton jButtonSpeichern = null;
    private JLabel jLabel = null;
    private JButton jButtonAbbruch = null;
    private JLabel jLabelUser = null;
    private JLabel jLabelGruppe = null;
    private JList list=null;
    
    public DlgUserGrpVerwaltung(final Frame owner) {
        super(owner);
        initialize();
    }
    private void initialize() {
		final Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); 
		final int x_pos = (int) (screenDimension.getWidth() / 2.0f - 500.0f / 2.0f); 
		final int y_pos = (int) ((screenDimension.getHeight() / 2.0f - 400.0f / 2.0f)-100); 

		this.setBounds(new Rectangle(x_pos, y_pos, 500, 400));
		this.setResizable(false);
		this.setContentPane(getJContentPane());
    }
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jLabelUser = new JLabel();
            jLabelUser.setBounds(new Rectangle(15, 15, 225, 25));
            jLabelUser.setText(Text.user);
            jLabelUser.setHorizontalAlignment(JLabel.CENTER);
            jLabelUser.setFont(new Font(GlobaleVariablen.standart_label1_schrift_typ, GlobaleVariablen.standart_label1_schrift_font, GlobaleVariablen.standart_label1_schrift_groesse));
            jLabelGruppe = new JLabel();
            jLabelGruppe.setBounds(new Rectangle(250, 15, 225, 25));
            jLabelGruppe.setText(Text.gruppen);
            jLabelGruppe.setHorizontalAlignment(JLabel.CENTER);
            jLabelGruppe.setFont(new Font(GlobaleVariablen.standart_label1_schrift_typ, GlobaleVariablen.standart_label1_schrift_font, GlobaleVariablen.standart_label1_schrift_groesse));
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(getJPanelUser(), null);
            jContentPane.add(getJPanelGruppe(), null);
            jContentPane.add(getJPanelSouth(), null);
            jContentPane.add(jLabelUser, null);
            jContentPane.add(jLabelGruppe, null);
        }
        return jContentPane;
    }
    private JPanel getJPanelUser() {
        if (jPanelUser == null) {
            jPanelUser = new JPanel();
            jPanelUser.setLayout(new GridLayout(1,1));
            jPanelUser.setBounds(new Rectangle(15, 55, 225, 260));
            jPanelUser.add(createListUser(Text.CLUser));
            
        }
        return jPanelUser;
    }
    private JPanel getJPanelGruppe() {
        if (jPanelGruppe == null) {
            jPanelGruppe = new JPanel();
            jPanelGruppe.setLayout(new GridLayout(1,1));
            jPanelGruppe.setBounds(new Rectangle(250, 55, 225, 260));
            jPanelGruppe.add(createListGruppe(Text.CLGruppe));
        }
        return jPanelGruppe;
    }
    private JPanel getJPanelSouth() {
        if (jPanelSouth == null) {
            jLabel = new JLabel();
            jLabel.setText("");
            jLabel.setPreferredSize(new Dimension(40, 0));
            jPanelSouth = new JPanel();
            jPanelSouth.setLayout(new FlowLayout());
            jPanelSouth.setBounds(new Rectangle(0, 333, 493, 40));
            jPanelSouth.add(getJButtonSpeichern(), null);
            jPanelSouth.add(jLabel, null);
            jPanelSouth.add(getJButtonAbbruch(), null);
        }
        return jPanelSouth;
    }
    private JButton getJButtonSpeichern() {
        if (jButtonSpeichern == null) {
            jButtonSpeichern = new JButton();
            jButtonSpeichern.setText(Text.jButtonSpeichern);
            jButtonSpeichern.setPreferredSize(new Dimension(100, 30));
            jButtonSpeichern.setFont(new Font(GlobaleVariablen.standart_jbutton_schrift_typ, GlobaleVariablen.standart_jbutton_schrift_font, GlobaleVariablen.standart_jbutton_schrift_groesse));
			jButtonSpeichern.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
					int len = list.getModel().getSize();
					for(int i=0; i<len; i++){
						String grp_name = getTitle(list, i);
						int grp_id=DB.getGrpID(grp_name);
						DB.delUserGrpRechte(grp_id);
					}
					for(int i=0; i<len; i++){
						DefaultListModel model = (DefaultListModel)list.getModel();
						String grp_name = getTitle(list, i);
						int grp_id=DB.getGrpID(grp_name);
						if((i>0)&&(getTitle(list, i).compareToIgnoreCase(getTitle(list, (i-1)))==0)){
							String user_name=model.getElementAt(i).toString();
							DB.setUserGrpRechte(user_name, grp_id, grp_name);
						}
					}
					AVS3.trace(Text.TRAUserGrpGespeichert, 0);
					dispose();					
                }
            });
        }
        return jButtonSpeichern;
    }
    private JButton getJButtonAbbruch() {
        if (jButtonAbbruch == null) {
            jButtonAbbruch = new JButton();
            jButtonAbbruch.setPreferredSize(new Dimension(100, 30));
            jButtonAbbruch.setText(Text.jButtonAbbruch);
            jButtonAbbruch.setFont(new Font(GlobaleVariablen.standart_jbutton_schrift_typ, GlobaleVariablen.standart_jbutton_schrift_font, GlobaleVariablen.standart_jbutton_schrift_groesse));
            jButtonAbbruch.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    dispose();
                }
            });
        }
        return jButtonAbbruch;
    }
    private JPanel createListUser(final String listId) {
        DefaultListModel model = new DefaultListModel();
        String erg[]=DB.getUser();
        for(int i=0; i<erg.length; i++){
            if(erg[i]==null){
                break;
            }
            String erg_split[]=GlobaleFunction.split(erg[i], ": ");
            model.addElement(erg_split[1]);
        }
        JList list = new JList(model);
        list.setName(listId);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setPreferredSize(new Dimension(225, 250));
        list.setDragEnabled(true);
        list.setTransferHandler(new ListTransferHandler());
        JPanel panel = new JPanel();
        panel.add(scrollPane);
        return panel;
    }
    private JPanel createListGruppe(final String listId) {
        DefaultListModel model = new DefaultListModel();
        String erg[]=DB.getGrps();
        for(int i=0; i<erg.length; i++){
            if(erg[i]==null){
                break;
            }
            String erg_split[]=GlobaleFunction.split(erg[i], ": ");
            if(erg_split[1].compareToIgnoreCase("keine")!=0){
                model.addElement(new GroupItem(erg_split[1]));
	            
	            int grp_id=Integer.parseInt(erg_split[0]);
	            String erg_user[]=DB.getUserGrpRechte(grp_id);
	            int len = erg_user.length;
	            for(int c=0; c<len; c++){
	            	if(erg_user[c]==null){
	            		break;
	            	}	            	
	            	model.addElement(erg_user[c]); 
	            }            
            }
        }
        list = new JList(model);
        list.setName(listId);
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setPreferredSize(new Dimension(225, 250));
        list.setDragEnabled(true);
        ListTransferHandler th = new ListTransferHandler();
        list.setTransferHandler(th);
        list.setCellRenderer(new GroupCellRenderer());
        list.setDropTarget(new GroupDropTarget(th));
        list.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                if(e.getValueIsAdjusting()) return;
            }
        });
        
        JPanel panel = new JPanel();
        panel.add(scrollPane);
        return panel;
    }
    private String getTitle(final JList list, final int index){
        DefaultListModel model = (DefaultListModel)list.getModel();
        for (int start = index; start > -1; start--) {
            Object val = model.getElementAt(start);
            if(val instanceof GroupItem) return val.toString();
        }
        return null;
    }
    abstract class DataTransferHandler extends TransferHandler {
        private int actions = COPY_OR_MOVE;
        protected int dropAction;
        protected abstract Object exportListData(JComponent c);
        protected abstract void importListData(JComponent c, String str);
        protected abstract void cleanup(JComponent c, boolean remove);
        protected Transferable createTransferable(final JComponent c) {
            return new GenericTransferable(exportListData(c));
        }
        public int getSourceActions(final JComponent c) {
            return actions;
        }
        public boolean importData(final JComponent c, final Transferable t) {
            JList source = (JList)c;
            if(source.getName().compareToIgnoreCase(Text.CLGruppe)==0){
                if (canImport(c, t.getTransferDataFlavors())) {
                    try {
                        String str = (String)t.getTransferData(DataFlavor.stringFlavor);
                        importListData(c, str);
                        sortAll(source);
                        return true;
                    } catch (UnsupportedFlavorException ufe) {
                    } catch (IOException ioe) {
                    }
                }
            }else{
                return true;
            }
            return false;
        }
        protected void exportDone(final JComponent c, final Transferable trans, final int action) {
            Object data = null;
            JList source = (JList)c;
            if(source.getName().compareToIgnoreCase(Text.CLGruppe)==0){
                try {data = trans.getTransferData(DataFlavor.stringFlavor);
                } catch (IOException ex) {
                } catch (UnsupportedFlavorException ex) {}
                cleanup(c, !(data instanceof GroupItem) );
                
            }
        }
        public boolean canImport(final JComponent c, final DataFlavor[] flavors) {
            for (int ndx = 0; ndx < flavors.length; ndx++) {
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) {
                    return true;
                }
            }
            return false;
        }
        private void sortAll(final JList target) {
            if(!target.getName().equalsIgnoreCase(Text.CLGruppe)) return;
            DefaultListModel model = (DefaultListModel)target.getModel();
            SortedSet<String> grp = null;
            int from = 0;
            int index = 0;
            for (index = 0; index < model.getSize(); index++) {
                Object val = model.getElementAt(index);
                if(val instanceof GroupItem){
                    sortGrp(grp, model, from+1, index-1);
                    grp = new TreeSet<String>();
                    from = index;
                }else{
                    grp.add(val.toString());
                }
            }
            sortGrp(grp, model, from+1, index-1);
        }
        private void sortGrp(final SortedSet grp, final DefaultListModel model, final int from, final int to) {
            if(grp == null || from >= to) return;
            model.removeRange(from, to);
            Iterator<String> it = grp.iterator();
            int start = from;
            while(it.hasNext())
                model.insertElementAt(it.next(), start++);
        }
    }
    class ListTransferHandler extends DataTransferHandler {
        public JList target;
        public int[] rows = null;
        public int addIndex = -1; //Position an der die Zeilen eingefügt werden
        public int addCount = 0;  //Anzahl der eingefügten Zeilen.
        private int dropIndex;
        protected Object exportListData(final JComponent c) {
            JList list = (JList)c;
            rows = list.getSelectedIndices();
            StringBuffer buff = new StringBuffer();
            if(rows != null){
                for (int ndx = 0; ndx < rows.length; ndx++) {
                    Object val = ((DefaultListModel)list.getModel()).getElementAt(rows[ndx]);
                    if( !(val instanceof GroupItem) ){
                        buff.append(val == null ? "" : val.toString());
                        if (ndx != rows.length - 1) {
                            buff.append("\n");
                        }
                    }else{
                        return val;
                    }
                }
            }
            return buff.toString();
        }
        protected void importListData(final JComponent c, final String str) {
            target = (JList)c;
            DefaultListModel model = (DefaultListModel)target.getModel();
            //Der Benutzer wird daran gehindert die Daten auf sich selbst fallen zu lassen.
            //Zum Beispiel, wenn der Benutzer die Zeilen #4,#5,#6 und #7 verschiebt und
            //versucht sie unterhalb der Zeile #5 einzufügen, wäre es
            //problematisch die ursprünglichen Zeilen zu entfernen.
            //Daher wird dies nicht erlaubt.
            if (rows != null && dropIndex >= rows[0] - 1 &&
                    dropIndex <= rows[rows.length - 1]) {
                rows = null;
                return;
            }
            if(rows != null && inSameGroup(dropIndex, rows[0], model)){
                rows = null;
                return;
            }
            int max = model.getSize();
            if (dropIndex < 0) {
                dropIndex = max;
            } else {
                dropIndex++;
                if (dropIndex > max) {
                    dropIndex = max;
                }
            }

            addIndex = dropIndex;
            String[] values = str.split("\n");
            addCount = 0;
            for (int ndx = 0; ndx < values.length ; ndx++) {
                Object obj = values[ndx];
                if(!exists(obj, dropIndex, model)){
                    model.insertElementAt( obj, dropIndex++);
                    addCount++;
                }
            }
            //Wenn wir Zeilen innerhalb derselben Liste verschieben, müssen
            //wir die Zeilen entsprechend anpassen, da diejenigen
            //hinter dem Einfügungspunkt verschoben werden.
            if (rows!= null && addCount > 0) {
                for (int ndx = 0; ndx < rows.length; ndx++) {
                    if (rows[ndx] > addIndex) {
                        rows[ndx] += addCount;
                    }
                }
            }
        }
        protected void cleanup(final JComponent c, final boolean remove) {
            JList source = (JList)c;
            if (dropAction == MOVE && remove && rows != null) {
                DefaultListModel model = (DefaultListModel)source.getModel();
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) {
                    model.removeElementAt(rows[ndx]);
                }
            }
            rows = null;
            addCount = 0;
            addIndex = -1;
        }
        protected void setIndex(final int index) {
            dropIndex = index;
        }
        private boolean exists(final Object obj, final int dropIndex, final DefaultListModel model) {
            for (int row = dropIndex; row < model.getSize(); row++) {
                Object val = model.getElementAt(row);
                if(val instanceof GroupItem) break;
                if(val.toString().equals(obj.toString())){
                    return rows==null?true:!inSameGroup(row, rows[0], model);
                }
            }
            for (int row = dropIndex-1; row > -1; row--) {
                Object val = model.getElementAt(row);
                if(val instanceof GroupItem) break;
                if(val.toString().equals(obj.toString())){
                    return rows==null?true:!inSameGroup(row, rows[0], model);
                }
            }
            return false;
        }
        private boolean inSameGroup(final int row, final int row1, final DefaultListModel model) {
            List<Integer> grp = null;
            for (int index = 0; index < model.getSize(); index++) {
                Object val = model.getElementAt(index);
                if(val instanceof GroupItem){
                    if(grp != null && grp.contains(row) && grp.contains(row1))return true;
                    grp = new ArrayList<Integer>();
                    grp.add(index);
                }else grp.add(index);
            }
            if(grp != null && grp.contains(row) && grp.contains(row1))return true;
            return false;
        }
        
        private void setAction(int i) {
            super.dropAction = i;
        }
    }
    class GroupDropTarget extends DropTarget{
        private ListTransferHandler handler;
        private Insets autoscrollInsets = new Insets(20, 20, 20, 20);
        public GroupDropTarget(final ListTransferHandler th){
            handler = th;
        }
        public void drop(final DropTargetDropEvent dtde) {
            Object data = null;
            try {data = dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
            } catch (IOException ex) {
            } catch (UnsupportedFlavorException ex) {}
            if( !(data instanceof GroupItem) ){
                Point p = dtde.getLocation();
                JList list = (JList) getComponent();
                int index = list.locationToIndex(p);
                handler.setIndex(index);
                handler.importData(list, dtde.getTransferable());
                super.drop(dtde);
            }
        }
        public void dragOver(DropTargetDragEvent dtde) {
            handler.setAction(dtde.getDropAction());
            JList list = (JList) dtde.getDropTargetContext().getComponent();
            Point loc = dtde.getLocation();
            autoscroll(list, loc);
            super.dragOver(dtde);
        }
        private void autoscroll(JList list, Point cursorLocation) {
            Insets insets = getAutoscrollInsets();
            Rectangle outer = list.getVisibleRect();
            Rectangle inner = new Rectangle(
                    outer.x+insets.left,
                    outer.y+insets.top,
                    outer.width-(insets.left+insets.right),
                    outer.height-(insets.top+insets.bottom));
            if (!inner.contains(cursorLocation))  {
                Rectangle scrollRect = new Rectangle(
                        cursorLocation.x-insets.left,
                        cursorLocation.y-insets.top,
                        insets.left+insets.right,
                        insets.top+insets.bottom);
                list.scrollRectToVisible(scrollRect);
            }
        }
        private Insets getAutoscrollInsets() {
            return autoscrollInsets;
        }
    }
    class GenericTransferable implements Transferable{
        private Object data;
        public GenericTransferable(final Object data){
            this.data = data;
        }
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[]{DataFlavor.stringFlavor};
        }
        public boolean isDataFlavorSupported(final DataFlavor flavor) {
            return true;
        }
        public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            return data;
        }
    }
    class GroupItem{
        private String item;
        public GroupItem(final String str){item = str;}
        public String toString() {return item;}
    }
    class GroupCellRenderer extends DefaultListCellRenderer {
        private Color bg = new Color(159, 152, 150);
        private Color bg2 = new Color(130, 130, 125);
        public Component getListCellRendererComponent(
                final JList list, final Object value, final int index, final boolean selected, final boolean focus){
            super.getListCellRendererComponent(list, value, index, selected, focus);
            if(!selected){
                setForeground(Color.BLACK);
                setBackground(Color.WHITE);
            }
            setHorizontalAlignment(JLabel.LEFT);
            setBorder(BorderFactory.createEmptyBorder());
            if(value instanceof GroupItem){
                setBorder(BorderFactory.createLineBorder(bg2));
                setHorizontalAlignment(JLabel.CENTER);
                setFont(getFont().deriveFont(14f));
                setForeground(Color.BLACK);
                setBackground(bg);
            }
            return this;
        }
    }
}
```


----------



## Steve Wonder (3. Jul 2008)

Hm, 
ok aber wo sind da die beiden Tabellen. 

Gibt es wirklich kein Beispiel in dem ein Frame geöffnet wird und da sind zwei Tabellen drin und man kann per Drag an Drop die Inhalte der TableRows verschieben??

Danke


----------



## Kaladial (3. Jul 2008)

hmm ok ich habs net per table gemacht aber das müsste man drauf umsetzten können


----------



## Steve Wonder (3. Jul 2008)

Ok, trotzdem Danke. Wie gesagt ich bin kein Java-Crack und will mich auch nicht endlos lange mit einer Billig-Funktionalität aufhalten....

Naja wenns sowas net gibt, hab ich halt Pech gehabt


----------



## Steve Wonder (3. Jul 2008)

Oh Mann, Oh Mann,

hab grad noch ein bisschen gegoogelt. Wer erfindet denn so eine idiotische Sprache und meint dann auch noch das sei das non plus ultra?
Hoffentlich verschwindet Java bald in der Versenkung. Es kann ja wohl nicht sein, dass man für so eine billige Funktion so einen Aufriß treiben muss. 
Ich werde das ganze jetzt mit C# machen. Das geht wesentlich schneller...

Trotzdem Danke und noch viel Spaß mit Java...


----------



## Krondor (3. Jul 2008)

Über solche Kommentare kann ich immer einfach nur lachen.
In der einen Sprache gibt es die und die Methode die einem etwas einfacher macht und in einer anderen Sprache gibts wieder dafür andere.

Hättest dir ja auch können einfach nen doofen Button machen für hin und für zurück.

Davon abgesehen sprechen wir hier noch übers programmieren und nicht über Word-Dokumente schreiben... 

Wieso gibts eigentlich keine Funktion die mich morgens weckt, indem sie mir die Decke wegzieht, schon mal die Kaffeemaschine füllt, anschaltet und den Toast toastet. Schön wäre auch, wenn sie den Toast schon mal mit dem Zeug bestreicht, was ich gerne drauf hätte aber das ist halt optional.....

Und das ganze bitte ohne installiertes Java, ohne dass mein PC an ist und ohne dass ich vorher was einstellen muss. Sie sollte halt raten, wann ich morgens aufstehen will und ....

Sorry für den Zynismus


----------



## Kaladial (3. Jul 2008)

@Krondor: das ding gibt es doch und das nennt sich frau


----------



## Oli (3. Jul 2008)

Hi,

hm... das Niveau in diesem Thread ist ja unglaublich..

Ich hatte das selbe Problem aber auch keine wirklich praktikable Lösung gefunden.

Ich habe die Tabelle table 1:
DropTarget t = new DropTarget();


```
try {
    t.setComponent(tableWeite);
    t.addDropTargetListener(dtl);
    }
    catch (Exception e) {
    e.printStackTrace();
    }
tableWeite.setDropTarget(t);
```
Listener:


```
public DropTargetListener dtl = new DropTargetListener() {
    public void dragEnter(DropTargetDragEvent dtde) {
        System.out.println("LIST");
    }
    public void dragExit(DropTargetEvent dte) {
        System.out.println("LIST");
    }

    public void dragOver(DropTargetDragEvent dtde) {
        System.out.println("LIST");
    }

    public void drop(DropTargetDropEvent dtde) {
        System.out.println("DROPPED");
        System.out.println(dtde.getClass());
        System.out.println(dtde.getDropAction());
    }

    public void dropActionChanged(DropTargetDragEvent dtde) {
        System.out.println("LIST");
    }
};
```


Tabelle 2:


```
tableWeitePPM.setColumnSelectionAllowed(false);
    tableWeitePPM.setRowSelectionAllowed(true);
    tableWeitePPM.setSelectionMode(2);
    tableWeitePPM.setDragEnabled(true);
    tableWeitePPM.addMouseMotionListener(PPM_dndListener);
```

Listener:


```
public MouseMotionListener PPM_dndListener = new MouseMotionListener() {
    public void mouseDragged(MouseEvent e) {
        System.out.println("DRAGGED");
    }

    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
    }
};
```


Der DropTargetListener reageirt nicht....

Warum ist das so?

Grüße
[/code]


----------



## Beni (3. Jul 2008)

Wenn ich die API richtig interpretiere, fehlt dir noch ein "setTransferHandler" bei der zweiten Tabelle.


----------



## Oli (3. Jul 2008)

Ich denke der TransferHandler ist nur für Aktionen im Clipboard. den brauch ich eigentlich nicht.
Mein Problem ist hier eher, dass ich die TableRow nicht verschieben kann.

Wenn ich eine Zelle nehme, dann kann ich den Inhalt in ein Texfeld ziehen, aber ich will ja die komplette row in die andere Tabelle übernehmen....

Des geht irgendwie nicht

Grüße


----------



## byte (3. Jul 2008)

Der TransferHandler kann sowohl für Clipboard als auch für DnD benutzt werden. Das ganze ist eigentlich relativ simpel:

1. TransferHandler implementieren
2. Transferable implementieren
3. TransferHandler in beiden Tables setzen


----------



## Oli (3. Jul 2008)

Ok, und wie imlementiert man einen TransferHandler, gibt´s da Beispiele, weil mit der Online Doku komm ich da jetzt nicht wirklic zurecht

Danke


----------



## byte (3. Jul 2008)

http://java.sun.com/docs/books/tutorial/uiswing/dnd/transferhandler.html

Die wichtigsten Methoden sind:

- createTransferable() : Dort erzeugst Du Dein Transferable, dass das Objekt der Tabellenzeile kapselt
- canImport() : Dort definierst Du, für welche Komponenten "Drop" gültig sein soll
- importData() : Dort nimmst Du das Objekt aus dem Transferable (s.o.) und fügst es in den Table ein.


----------



## André Uhres (4. Jul 2008)

Steve Wonder hat gesagt.:
			
		

> Ich habe zwei JTables und möchte eine Row von der einen in die andere schieben..


Probier mal dieses Beispiel: DragDropTable.java


----------

