Drag and drop Verständnissproblem.

Status
Nicht offen für weitere Antworten.

Giftstachel

Bekanntes Mitglied
Einen wunderschönen, wünsche ich.

ich habe folgendes verständnissproblem betreffend D&D, und hoffe, das mir das jemand erklären kann.


aufgabenstellung:

mache eine table mit daten. -> hab ich
machen eine andere table in einem anderen frame -> hab ich auch.
mache einen transfairhandler, der die daten aus einer oder mehrerer rows in die andere table per D6D überträgt. -> auch ok.
mache einen transfairhandler, der zwei vorher bestimmte datensätze überträgt.

also ich klicke z.b. in row nr.5 und col. nr. 10, und möchte die daten aus
row nr. 5 col. nr. 1
und
row nr. 1 und col. nr. 10
haben.

wo kann ich das im folgenden transfairhandler festlegen, welche daten er genau nehmen soll?
irgendwie enden alle meine versuche immer wieder dabei, das er mir die komplette row mit übernimmt *grummel*

Code:
abstract class StringTransferHandler extends TransferHandler {

        protected abstract String exportString(JComponent c);

        protected abstract void importString(JComponent c, String str);

        protected abstract void cleanup(JComponent c, boolean remove);

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

        public int getSourceActions(JComponent c) {
            return COPY_OR_MOVE;
        }

        public boolean importData(JComponent c, Transferable t) {
            if (canImport(c, t.getTransferDataFlavors())) {
                try {
                    String str = (String) t.getTransferData(DataFlavor.stringFlavor);
                    importString(c, str);
                    return true;
                } catch (UnsupportedFlavorException ufe) {
                } catch (IOException ioe) {
                }
            }
            return false;
        }

        protected void exportDone(JComponent c, Transferable data, int action) {
            cleanup(c, action == MOVE);
        }

        public boolean canImport(JComponent c, DataFlavor[] flavors) {
            for (int ndx = 0; ndx < flavors.length; ndx++) {
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) {
                    return true;
                }
            }
            return false;
        }
    }

    class TableTransferHandler extends StringTransferHandler {

        public JTable target;
        public int[] rows = null;
        public int addIndex = -1; //the position where rows are inserted
        public int addCount = 0;  //number of inserted rows

        protected String exportString(JComponent c) {
            JTable table = (JTable) c;
            rows = table.getSelectedRows();
            int colCount = table.getColumnCount();
            StringBuffer buff = new StringBuffer();
            for (int ndx = 0; ndx < rows.length; ndx++) {
                for (int j = 0; j < colCount; j++) {
                    Object val = table.getValueAt(rows[0], j);
                    buff.append(val == null ? "" : val.toString());
                    if (j != colCount - 1) {
                        buff.append(",");
                    }
                }
                if (ndx != rows.length - 1) {
                    buff.append("\n");
                }
            }
            return buff.toString();
        }

        protected void importString(JComponent c, String str) {
            target = (JTable) c;
            DefaultTableModel model = (DefaultTableModel) target.getModel();
            int index = target.getSelectedRow();
            //The user is not allowed to drop data on itself.
            //For example, when the user moves rows #4,#5,#6 and #7 and
            //tries to insert them below the row #5, it would be
            //problematic to remove the original rows.
            //That's why we don't allow it:
            if (rows != null && index >= rows[0] - 1 &&
                    index <= rows[rows.length - 1]) {
                rows = null;
                return;
            }
            int max = model.getRowCount();
            if (index < 0) {
                index = max;
            } else {
                index++;
                if (index > max) {
                    index = max;
                }
            }
            
            addIndex = index;
            //System.out.println ("index = " +index);
            String[] values = str.split("\n");
            //System.out.println ("values = " +values[0] + " " + values[1]);
            addCount = values.length;
            //for (int ndx = 0; ndx < values.length; ndx++) {
            //    model.insertRow(index++, values[ndx].split(" "));
            //}
            model.insertRow(index++, values[0].split(" "));
            model.insertRow(index++, values[1].split(" "));
            //If we are moving rows within the same table, we must
            //adapt the rows accordingly, as those below
            //the insertion point are shifted.
            if (rows != null && addCount > 0) {
                for (int ndx = 0; ndx < rows.length; ndx++) {
                    if (rows[ndx] > addIndex) {
                        rows[ndx] += addCount;
                    }
                }
            }
        }

        protected void cleanup(JComponent c, boolean remove) {
            JTable source = (JTable) c;
            if (remove && rows != null) {
                DefaultTableModel model =
                        (DefaultTableModel) source.getModel();
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) {
                    model.removeRow(rows[ndx]);
                }
            }
            rows = null;
            addCount = 0;
            addIndex = -1;
        }

danke euch.
 

Giftstachel

Bekanntes Mitglied
leider nö, weil beim abändern auf das eigentlich gewünschte ergebnis nimmt er dennoch die ganze row mit :(

Code:
protected String exportString(JComponent c) {
            //JTable table = (JTable) c;
            //row = table.getSelectedRow();
            //column = table.getSelectedColumn();
            StringBuffer buff = new StringBuffer();
            buff.append(table.getValueAt(row, 0).toString());
            buff.append(" ");
            buff.append(table.getValueAt(0, column).toString());
            buff.append(" ");
            buff.append("\n");
            return buff.toString();
        }
 

Giftstachel

Bekanntes Mitglied
also ich bin mir jetzt nicht sicher, ob du mich veralbern willst, aber was ein export und ein import ist, dessen bin ich mir vollständig bewusst. ;)

vielleicht erklär ich nochmal mein problem, und wo mir das verständniss abhanden kommt.

ich baue im export-string meinen string zusammen, den ich exportieren will, und zwar so:

Code:
protected String exportString(JComponent c) {
            //JTable table = (JTable) c;
            //row = table.getSelectedRow();
            //column = table.getSelectedColumn();
            StringBuffer buff = new StringBuffer();
            buff.append(table.getValueAt(row, 0).toString());
            buff.append(" ");
            buff.append(table.getValueAt(0, column).toString());
            buff.append(" ");
            buff.append("\n");
            return buff.toString();
        }

in meinem verständniss sieht der dann so aus:
value1 = value(row an stelle 0) + "leerzeichen zum trennen";
value2 = value(column an stelle 0) + "leerzeichen zum trennen";
das ganze wird im buffer zusammengefügt, und mit einem "\n" abgeschlossen, um später die möglichkeit zu geben, evtl noch einen zweiten datensatz anzuhängen.

richtig?

mein problem ist, das er aus dieser table aus irgendeinem grunde jedoch nicht die angegebenen values an den definierten stellen als string nimmt, sondern die komplette row, mit allen werten, und derweilen die angegebene column ignoriert.

der importstring sollte dann eigentlich die values die eigentlich im exportstring stehen sollten, nur wieder auseinanderpflückt.
aufgrund dessen gehe ich weiterhin davon aus, das also mein exportstring irgendwie nicht stimmt, überlagert wird, oder irgendetwas in dieser art.
und genau an der stelle wäre das gaaanz super, wenn mir jemand das ganze erklären könnte, mir einen tip gibt, woher die falschen werte kommen, oder vielleicht etwas näher darauf eingeht, wo mein denkfehler liegt.

super vielen dank nochmal an dieser stelle an alle, die mir dort weiterhelfen können.
vielleicht auch etwas über exportstring, und importstring hinausgehend ;)
 

André Uhres

Top Contributor
Giftstachel hat gesagt.:
also ich bin mir jetzt nicht sicher, ob du mich veralbern willst
Wie könnte ich.
Wie gesagt, der Fehler ist in importString. Das Prinzip braucht keine langen Erklärungen, ist ja äusserst simpel: was in exportString rausgeht, kommt in importString an und wird dort im target eingefügt. Was dort mit dem String genau geschehen soll, das kann wahrscheinlich niemand von uns ahnen, das musst du schon selbst wissen. Da du zweimal insertRow machst, nehm ich mal an, dass du zwei komplette Zeilen einfügen willst. Was dort in Wirklichkeit geschieht oder schiefgeht kannst du ja mit Konsolenausdruck sehr leicht und schnell überprüfen.
 

Giftstachel

Bekanntes Mitglied
nun ja. genau das ist mein problem, wie oben beschrieben. ich bekomme es nicht hin, das der export-string genau die angegebenen datensätze erhält.
was mit diesem string geschehen soll, ist auch vollkommen irrelevant, genau so wie wie oft dort was eingetragen weden soll.
wichtig für mich ist, und genau da hänge ich,...
ich bekomme die benötigten daten wie oben erklärt nicht in den export-string, sondern erhalte immer nur die row!!
was dann wiederum mit deiner erklärung nicht zusammenpasst, das der fehler im import-string liegt, wenn doch die daten im export-string zusammengesetzt werden, und ich dort ja nur 2 values mitgeben will, und dort ja dann nicht die ganze row erscheinen kann. *TotalInVerwirrungAbgleite*

sorry wenn ich nerve, aber mich nervt das selber, das ich nicht dahinterkomme.
 

Giftstachel

Bekanntes Mitglied
André?

ich geh jetzt in die apotheke und kauf mir eine schachtel Ibu-Profen, und jede menge Ibi-Dumm.
ich hab vergessen, den TransferHandler in meiner Gui zu setzen. mich wundert zwar, das dennoch daten übergeben worden sind, aber nun ja, das weiß der himmel.

gaanz vielen dank für deine geduld, und sorry wegen der nerven, die ich bei dir vernichtet habe:/

das mit dem KSKB hats einfach gebracht. das dort ist genau nach plan gelaufen, und meins nicht. das ganze gesplittet, fehler gefunden, fehler behoben^^

hier das KSKB falls es jemand brauchen sollte.

hier die drag-table

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.TransferHandler;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableModel;

public class DragDropTable extends JFrame {

    public DragDropTable() {
        setTitle("Drag and Drop JTable");
        JTextArea hints = new JTextArea("daten z.b.hier rein.");
        hints.setBorder(new LineBorder(Color.orange, 5));
        getContentPane().add(hints, BorderLayout.NORTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridLayout(2, 1));
        panel.add(createTable("Table A"));
        panel.add(createTable("Table B"));
        getContentPane().add(panel, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
    }

    private JPanel createTable(String tableId) {
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("Column 0");
        model.addColumn("Column 1");
        model.addColumn("Column 2");
        model.addColumn("Column 3");
        model.addRow(new String[]{tableId + " 00", tableId + " 01", tableId + " 02", tableId + " 03"});
        model.addRow(new String[]{tableId + " 10", tableId + " 11", tableId + " 12", tableId + " 13"});
        model.addRow(new String[]{tableId + " 20", tableId + " 21", tableId + " 22", tableId + " 23"});
        model.addRow(new String[]{tableId + " 30", tableId + " 31", tableId + " 32", tableId + " 33"});
        model.addRow(new String[]{tableId + " 40", tableId + " 41", tableId + " 42", tableId + " 43"});
        model.addRow(new String[]{tableId + " 50", tableId + " 51", tableId + " 52", tableId + " 53"});
        model.addRow(new String[]{tableId + " 60", tableId + " 61", tableId + " 62", tableId + " 63"});
        model.addRow(new String[]{tableId + " 70", tableId + " 71", tableId + " 72", tableId + " 73"});
        JTable table = new JTable(model) {
            //This method enables drop on an empty JTable:
            public boolean getScrollableTracksViewportHeight() {
                Container viewport = getParent();
                if (!(viewport instanceof JViewport)) {
                    return false;
                }
                return getPreferredSize().height < viewport.getHeight();
            }
        };
        table.getTableHeader().setReorderingAllowed(false);
        table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setPreferredSize(new Dimension(600, 300));
        table.setDragEnabled(true);
        table.setTransferHandler(new TableTransferHandler());
        JPanel panel = new JPanel();
        panel.add(scrollPane);
        panel.setBorder(BorderFactory.createTitledBorder(tableId));
        return panel;
    }

    public static void main(String[] args) {
        new DragDropTable().setVisible(true);
        DropTable drop = new DropTable();
        drop.runDrop();
    }

    abstract class StringTransferHandler extends TransferHandler {

        protected abstract String exportString(JComponent c);

        protected abstract void importString(JComponent c, String str);

        protected abstract void cleanup(JComponent c, boolean remove);

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

        public int getSourceActions(JComponent c) {
            return COPY_OR_MOVE;
        }

        public boolean importData(JComponent c, Transferable t) {
            if (canImport(c, t.getTransferDataFlavors())) {
                try {
                    String str = (String) t.getTransferData(DataFlavor.stringFlavor);
                    importString(c, str);
                    return true;
                } catch (UnsupportedFlavorException ufe) {
                } catch (IOException ioe) {
                }
            }
            return false;
        }

        protected void exportDone(JComponent c, Transferable data, int action) {
            cleanup(c, action == MOVE);
        }

        public boolean canImport(JComponent c, DataFlavor[] flavors) {
            for (int ndx = 0; ndx < flavors.length; ndx++) {
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) {
                    return true;
                }
            }
            return false;
        }
    }

    class TableTransferHandler extends StringTransferHandler {

    	 public JTable target;
         public int[] rows = null;
         public int row = 0;
         public int column = 0;
         public int addIndex = -1; //the position where rows are inserted
         public int addCount = 0;  //number of inserted rows

        protected String exportString(JComponent c) {
            JTable table = (JTable) c;
            row = table.getSelectedRow();
            column = table.getSelectedColumn();
            StringBuffer buff = new StringBuffer();
            buff.append(table.getValueAt(row, 0).toString());
            buff.append(" ");
            buff.append(table.getValueAt(0, column).toString());
            buff.append(" ");
            buff.append("\n");
            return buff.toString();
        }

        protected void importString(JComponent c, String str) {
            target = (JTable) c;
            DefaultTableModel model = (DefaultTableModel) target.getModel();
            int index = target.getSelectedRow();
            //The user is not allowed to drop data on itself.
            //For example, when the user moves rows #4,#5,#6 and #7 and
            //tries to insert them below the row #5, it would be
            //problematic to remove the original rows.
            //That's why we don't allow it:
            if (rows != null && index >= rows[0] - 1 &&
                    index <= rows[rows.length - 1]) {
                rows = null;
                return;
            }
            int max = model.getRowCount();
            if (index < 0) {
                index = max;
            } else {
                index++;
                if (index > max) {
                    index = max;
                }
            }
            addIndex = index;
            String[] values = str.split("\n");
            addCount = values.length;
            for (int ndx = 0; ndx < values.length; ndx++) {
                model.insertRow(index++, values[ndx].split(","));
            }
            //If we are moving rows within the same table, we must
            //adapt the rows accordingly, as those below
            //the insertion point are shifted.
            if (rows != null && addCount > 0) {
                for (int ndx = 0; ndx < rows.length; ndx++) {
                    if (rows[ndx] > addIndex) {
                        rows[ndx] += addCount;
                    }
                }
            }
        }

        protected void cleanup(JComponent c, boolean remove) {
            JTable source = (JTable) c;
            if (remove && rows != null) {
                DefaultTableModel model =
                        (DefaultTableModel) source.getModel();
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) {
                    model.removeRow(rows[ndx]);
                }
            }
            rows = null;
            addCount = 0;
            addIndex = -1;
        }
    }
}

hier die dropTable
Code:
package ausleser;
/*
 * DragDropTable.java
 * source level 1.4
 */

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.IOException;

public class DropTable extends JFrame {

    public DropTable() {
        setTitle("Drag and Drop JTable");
        JTextArea hints = new JTextArea("daten z.b.hier rein.");
        hints.setBorder(new LineBorder(Color.orange, 5));
        getContentPane().add(hints, BorderLayout.NORTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridLayout(2, 1));
        panel.add(createTable("Table A"));
        panel.add(createTable("Table B"));
        getContentPane().add(panel, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
    }

    private JPanel createTable(String tableId) {
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("Column 0");
        model.addColumn("Column 1");
        model.addColumn("Column 2");
        model.addColumn("Column 3");
        model.addRow(new String[]{tableId + " 00", tableId + " 01", tableId + " 02", tableId + " 03"});
        model.addRow(new String[]{tableId + " 10", tableId + " 11", tableId + " 12", tableId + " 13"});
        model.addRow(new String[]{tableId + " 20", tableId + " 21", tableId + " 22", tableId + " 23"});
        model.addRow(new String[]{tableId + " 30", tableId + " 31", tableId + " 32", tableId + " 33"});
        model.addRow(new String[]{tableId + " 40", tableId + " 41", tableId + " 42", tableId + " 43"});
        model.addRow(new String[]{tableId + " 50", tableId + " 51", tableId + " 52", tableId + " 53"});
        model.addRow(new String[]{tableId + " 60", tableId + " 61", tableId + " 62", tableId + " 63"});
        model.addRow(new String[]{tableId + " 70", tableId + " 71", tableId + " 72", tableId + " 73"});
        JTable table = new JTable(model) {
            //This method enables drop on an empty JTable:
            public boolean getScrollableTracksViewportHeight() {
                Container viewport = getParent();
                if (!(viewport instanceof JViewport)) {
                    return false;
                }
                return getPreferredSize().height < viewport.getHeight();
            }
        };
        table.getTableHeader().setReorderingAllowed(false);
        table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setPreferredSize(new Dimension(600, 300));
        table.setDragEnabled(true);
        table.setTransferHandler(new TableTransferHandler());
        JPanel panel = new JPanel();
        panel.add(scrollPane);
        panel.setBorder(BorderFactory.createTitledBorder(tableId));
        return panel;
    }

    public void runDrop() {
        new DropTable().setVisible(true);
    }

    abstract class StringTransferHandler extends TransferHandler {

        protected abstract String exportString(JComponent c);

        protected abstract void importString(JComponent c, String str);

        protected abstract void cleanup(JComponent c, boolean remove);

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

        public int getSourceActions(JComponent c) {
            return COPY_OR_MOVE;
        }

        public boolean importData(JComponent c, Transferable t) {
            if (canImport(c, t.getTransferDataFlavors())) {
                try {
                    String str = (String) t.getTransferData(DataFlavor.stringFlavor);
                    importString(c, str);
                    return true;
                } catch (UnsupportedFlavorException ufe) {
                } catch (IOException ioe) {
                }
            }
            return false;
        }

        protected void exportDone(JComponent c, Transferable data, int action) {
            cleanup(c, action == MOVE);
        }

        public boolean canImport(JComponent c, DataFlavor[] flavors) {
            for (int ndx = 0; ndx < flavors.length; ndx++) {
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) {
                    return true;
                }
            }
            return false;
        }
    }

    class TableTransferHandler extends StringTransferHandler {

    	 public JTable target;
         public int[] rows = null;
         public int row = 0;
         public int column = 0;
         public int addIndex = -1; //the position where rows are inserted
         public int addCount = 0;  //number of inserted rows

        protected String exportString(JComponent c) {
            JTable table = (JTable) c;
            row = table.getSelectedRow();
            column = table.getSelectedColumn();
            StringBuffer buff = new StringBuffer();
            buff.append(table.getValueAt(row, 0).toString());
            buff.append(" ");
            buff.append(table.getValueAt(0, column).toString());
            buff.append(" ");
            buff.append("\n");
            return buff.toString();
        }

        protected void importString(JComponent c, String str) {
            target = (JTable) c;
            DefaultTableModel model = (DefaultTableModel) target.getModel();
            int index = target.getSelectedRow();
            //The user is not allowed to drop data on itself.
            //For example, when the user moves rows #4,#5,#6 and #7 and
            //tries to insert them below the row #5, it would be
            //problematic to remove the original rows.
            //That's why we don't allow it:
            if (rows != null && index >= rows[0] - 1 &&
                    index <= rows[rows.length - 1]) {
                rows = null;
                return;
            }
            int max = model.getRowCount();
            if (index < 0) {
                index = max;
            } else {
                index++;
                if (index > max) {
                    index = max;
                }
            }
            addIndex = index;
            String[] values = str.split("\n");
            addCount = values.length;
            for (int ndx = 0; ndx < values.length; ndx++) {
                model.insertRow(index++, values[ndx].split(","));
            }
            //If we are moving rows within the same table, we must
            //adapt the rows accordingly, as those below
            //the insertion point are shifted.
            if (rows != null && addCount > 0) {
                for (int ndx = 0; ndx < rows.length; ndx++) {
                    if (rows[ndx] > addIndex) {
                        rows[ndx] += addCount;
                    }
                }
            }
        }

        protected void cleanup(JComponent c, boolean remove) {
            JTable source = (JTable) c;
            if (remove && rows != null) {
                DefaultTableModel model =
                        (DefaultTableModel) source.getModel();
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) {
                    model.removeRow(rows[ndx]);
                }
            }
            rows = null;
            addCount = 0;
            addIndex = -1;
        }
    }
}
das ganze geht natürlich auch ander herum.
und wenn jemand zufällig eine oder mehrere rows Dragen und Droppen will:

Code:
package demo;
/*
 * DragDropTable.java
 * source level 1.4
 */

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.IOException;

public class DragDropTable extends JFrame {

    public DragDropTable() {
        setTitle("Drag and Drop JTable");
        JTextArea hints = new JTextArea("1. Select a row in Table A. " +
                "Press the row again and drag. \n     " +
                "While dragging the mouse pointer over Table B, the row that is just under the mouse pointer is marked " +
                "— the new rows are inserted below the selected row. \n     " +
                "Let the row drop on Table B. Note that the row has been removed from Table A, " +
                "and appears now in Table B. \n" +
                "2. Select two rows in Table A and let them drop on Table B. " +
                "Two new rows appear in Table B. ");
        hints.setEditable(false);
        hints.setBackground(new Color(255, 255, 204));
        hints.setBorder(new LineBorder(Color.orange, 5));
        getContentPane().add(hints, BorderLayout.NORTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridLayout(2, 1));
        panel.add(createTable("Table A"));
        panel.add(createTable("Table B"));
        getContentPane().add(panel, BorderLayout.CENTER);
        pack();
        setLocationRelativeTo(null);
    }

    private JPanel createTable(String tableId) {
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("Column 0");
        model.addColumn("Column 1");
        model.addColumn("Column 2");
        model.addColumn("Column 3");
        model.addRow(new String[]{tableId + " 00", tableId + " 01", tableId + " 02", tableId + " 03"});
        model.addRow(new String[]{tableId + " 10", tableId + " 11", tableId + " 12", tableId + " 13"});
        model.addRow(new String[]{tableId + " 20", tableId + " 21", tableId + " 22", tableId + " 23"});
        model.addRow(new String[]{tableId + " 30", tableId + " 31", tableId + " 32", tableId + " 33"});
        model.addRow(new String[]{tableId + " 40", tableId + " 41", tableId + " 42", tableId + " 43"});
        model.addRow(new String[]{tableId + " 50", tableId + " 51", tableId + " 52", tableId + " 53"});
        model.addRow(new String[]{tableId + " 60", tableId + " 61", tableId + " 62", tableId + " 63"});
        model.addRow(new String[]{tableId + " 70", tableId + " 71", tableId + " 72", tableId + " 73"});
        JTable table = new JTable(model) {
            //This method enables drop on an empty JTable:
            public boolean getScrollableTracksViewportHeight() {
                Container viewport = getParent();
                if (!(viewport instanceof JViewport)) {
                    return false;
                }
                return getPreferredSize().height < viewport.getHeight();
            }
        };
        table.getTableHeader().setReorderingAllowed(false);
        table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setPreferredSize(new Dimension(400, 100));
        table.setDragEnabled(true);
        table.setTransferHandler(new TableTransferHandler());
        JPanel panel = new JPanel();
        panel.add(scrollPane);
        panel.setBorder(BorderFactory.createTitledBorder(tableId));
        return panel;
    }

    public static void main(String[] args) {
        new DragDropTable().setVisible(true);
    }

    abstract class StringTransferHandler extends TransferHandler {

        protected abstract String exportString(JComponent c);

        protected abstract void importString(JComponent c, String str);

        protected abstract void cleanup(JComponent c, boolean remove);

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

        public int getSourceActions(JComponent c) {
            return COPY_OR_MOVE;
        }

        public boolean importData(JComponent c, Transferable t) {
            if (canImport(c, t.getTransferDataFlavors())) {
                try {
                    String str = (String) t.getTransferData(DataFlavor.stringFlavor);
                    importString(c, str);
                    return true;
                } catch (UnsupportedFlavorException ufe) {
                } catch (IOException ioe) {
                }
            }
            return false;
        }

        protected void exportDone(JComponent c, Transferable data, int action) {
            cleanup(c, action == MOVE);
        }

        public boolean canImport(JComponent c, DataFlavor[] flavors) {
            for (int ndx = 0; ndx < flavors.length; ndx++) {
                if (DataFlavor.stringFlavor.equals(flavors[ndx])) {
                    return true;
                }
            }
            return false;
        }
    }

    class TableTransferHandler extends StringTransferHandler {

        public JTable target;
        public int[] rows = null;
        public int addIndex = -1; //the position where rows are inserted
        public int addCount = 0;  //number of inserted rows

        protected String exportString(JComponent c) {
            JTable table = (JTable) c;
            rows = table.getSelectedRows();
            int colCount = table.getColumnCount();
            StringBuffer buff = new StringBuffer();
            for (int ndx = 0; ndx < rows.length; ndx++) {
                for (int j = 0; j < colCount; j++) {
                    Object val = table.getValueAt(rows[ndx], j);
                    buff.append(val == null ? "" : val.toString());
                    if (j != colCount - 1) {
                        buff.append(",");
                    }
                }
                if (ndx != rows.length - 1) {
                    buff.append("\n");
                }
            }
            return buff.toString();
        }

        protected void importString(JComponent c, String str) {
            target = (JTable) c;
            DefaultTableModel model = (DefaultTableModel) target.getModel();
            int index = target.getSelectedRow();
            //The user is not allowed to drop data on itself.
            //For example, when the user moves rows #4,#5,#6 and #7 and
            //tries to insert them below the row #5, it would be
            //problematic to remove the original rows.
            //That's why we don't allow it:
            if (rows != null && index >= rows[0] - 1 &&
                    index <= rows[rows.length - 1]) {
                rows = null;
                return;
            }
            int max = model.getRowCount();
            if (index < 0) {
                index = max;
            } else {
                index++;
                if (index > max) {
                    index = max;
                }
            }
            addIndex = index;
            String[] values = str.split("\n");
            addCount = values.length;
            for (int ndx = 0; ndx < values.length; ndx++) {
                model.insertRow(index++, values[ndx].split(","));
            }
            //If we are moving rows within the same table, we must
            //adapt the rows accordingly, as those below
            //the insertion point are shifted.
            if (rows != null && addCount > 0) {
                for (int ndx = 0; ndx < rows.length; ndx++) {
                    if (rows[ndx] > addIndex) {
                        rows[ndx] += addCount;
                    }
                }
            }
        }

        protected void cleanup(JComponent c, boolean remove) {
            JTable source = (JTable) c;
            if (remove && rows != null) {
                DefaultTableModel model =
                        (DefaultTableModel) source.getModel();
                for (int ndx = rows.length - 1; ndx >= 0; ndx--) {
                    model.removeRow(rows[ndx]);
                }
            }
            rows = null;
            addCount = 0;
            addIndex = -1;
        }
    }
}

danke nochmal :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Drag & Drop Hilfe Java Basics - Anfänger-Themen 5
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
M Drag & Drop - Interaktion zwischen Java und dem OS Java Basics - Anfänger-Themen 1
B Drag & Drop für Panels Java Basics - Anfänger-Themen 6
B List - Drag&Drop Java Basics - Anfänger-Themen 8
P Input/Output String via Drag & Drop auf jar-Archiv Java Basics - Anfänger-Themen 2
K Eclipse wie Swing per Drag und Drop erstellen Java Basics - Anfänger-Themen 2
U Drag&Drop von Tabelle in Textfeld Java Basics - Anfänger-Themen 3
S Drag and Drop von .txt Dateien in eine Liste Java Basics - Anfänger-Themen 2
M Drag and Drop eines Graphikelements Java Basics - Anfänger-Themen 19
R Drag&Drop mit Parametern Java Basics - Anfänger-Themen 6
B Drag and Drop fähige Trackliste..nurnoch ein kleines Problem Java Basics - Anfänger-Themen 16
O Drag & Drop mit Image? Java Basics - Anfänger-Themen 2
G Drag n' Drop - Probleme mit Transferable Java Basics - Anfänger-Themen 10
T ganzes Object Drag und Drop Java Basics - Anfänger-Themen 19
G Drag and Drop Java Basics - Anfänger-Themen 6
N drag and drop mit JList Java Basics - Anfänger-Themen 5
B Drag&Drop mit Swing Java Basics - Anfänger-Themen 17
B Swing: Zeichnen mit Drag and Drop Java Basics - Anfänger-Themen 11
R Drag'n'Drop Box Java Basics - Anfänger-Themen 2
E Cursor Image bei Drag'n'Drop ändern Java Basics - Anfänger-Themen 6
X Gwt DnD, Drag auf Droparea in anderer Klasse? Java Basics - Anfänger-Themen 0
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
S Java und HTML- Drop Down- Mehrfachauswahl Java Basics - Anfänger-Themen 3
D Zwei Drop downs für voneinander abhängige Bundesländer- und Städteauswahl Java Basics - Anfänger-Themen 9
K SWT Drop Box Java Basics - Anfänger-Themen 11
E Adobe Designer Drop Down Feld & If Abfrage Java Basics - Anfänger-Themen 4
M statt drop down menü - buttons Java Basics - Anfänger-Themen 5
DaniSahne96 Codebeispiel Verständnissproblem Java Insel Java Basics - Anfänger-Themen 19
H Datentypen Doppelte Verkette Liste - Verständnissproblem Java Basics - Anfänger-Themen 5
T Kleines Verständnissproblem mit Regex Java Basics - Anfänger-Themen 4
S Verständnissproblem Objekte Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben