Drag und drop aus einer JTable - bitte um Unterstützung

jowu

Neues Mitglied
Hallo zusammen,

erst mal ein gutes neues Jahr 2024!

Vielleicht mag mir einer helfen, wie man einen drag und drop von einer JTable in eine JTree macht. Ich habe Swing seit bald 10 Jahren nicht mehr gemacht und JavaFX kann ich gar nicht. Bin auch nicht professionell mit Java unterwegs, brauche das Java nur als Werkzeug, weil Excel hier nicht mehr wirklich geeignet ist.

Ich wollte eine kleine Swing-Anwendung bauen, wo man Konten schnell mit der Maus in eine Hierarchie zuordnen kann. Links aus einer JTable mit der Maus auswählen und dann in eine JTree rechts daneben reinschieben. Die GUI funktioniert auch soweit, nur mit dem drag and drop sitze ich seit 3 Tagen da, habe nach Anleitungen aus dem www alle möglichen Klassen angelegt und abgeleitet, alle möglichen Interfaces implementiert. Ich sehe den Wald vor lauter Bäumen nicht mehr und verzweifle langsam. Habe alle möglichen Transferables, DataFlavors, Listener etc... angelegt/erweitert/implementiert und jedesmal kommt was anderes raus.

In meinem kleinen Eclipse-Projekt gibt es eine eigene Klasse pojos.Konto, das ist ein primitives Object, das einen String als Kontonummer hat, einen String als Kontotext und noch zwei, drei andere Attribute. Die Attribute sind alle private und final und werden im Konstruktor gesetzt, und es gibt Getters für alle Attribute.

Des weiteren habe ich eine JTable, die ein selberstelltes KontoTableModel enthält. In dem Model ist eine ArrayList mit Konten als Datengrundlage. Die JTable hat setDraggable(true) gesetzt.

Testweise habe ich folgendes gemacht:
Innerhalb des gleichen JFrame gibt es in einem benachbarten JPanel eine JTextArea. Wenn ich nach Anleitung aus dem www einen Drag und Drop ausprogrammiere von der JTable in die JTextArea, so bekomme ich eine html-Repräsentation der selektierten Zeilen aus der JTable in der JTextArea ausgegeben. Ich möchte aber eine Liste von meiner speziellen Klasse Konten im Transferable haben und mit dieser arbeiten.

Die ganzen Lehrbespiele, die ich gefunden habe, sind mit Strings oder Files und in jedem Beispiel ist es anders ausprogrammiert.

Ich würde mich über Unterstützung sehr freuen

Johannes
 

Oneixee5

Top Contributor
Das sind sehr wenig Infos. Für ein Beispiel braucht man den Aufbau der Konten.
Trotzdem hier ein Beispiel, in welchem eine Tabellenzeile als String verschoben werden kann. Das ist natürlich nicht ideal aber die Infos fehlen eben. Es handelt sich nur um ein Beispiel, in einem echten Projekt sollte eine Auslagerung der inneren Klassen und eine bessere Strukturierung durchgeführt werden. Evtl. gibt es ein Projekt bei Github o.ä. welches man auschecken kann.
Java:
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.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class Main {
   
    public static void main(final String[] args) {
        final JFrame frame = new JFrame("Drag and Drop Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create JTable with some sample data
        final String[] columnNames = {"Name", "Age", "Gender"};
        final Object[][] data = {
                {"Alice", 28, "Female"},
                {"Bob", 35, "Male"},
                {"Charlie", 20, "Male"},
                {"Diana", 42, "Female"}
        };
        final DefaultTableModel model = new DefaultTableModel(data, columnNames);
        final JTable table = new JTable(model);

        // Create JTree
        final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        final DefaultTreeModel treeModel = new DefaultTreeModel(root);
        final JTree tree = new JTree(treeModel);

        // Enable drag from JTable
        table.setDragEnabled(true);
        table.setTransferHandler(new TransferHandler() {
            @Override
            public int getSourceActions(final JComponent c) {
                return TransferHandler.COPY;
            }

            @Override
            protected Transferable createTransferable(final JComponent c) {
                final JTable table = (JTable) c;
                final int[] selectedRows = table.getSelectedRows();
                final StringBuilder data = new StringBuilder();
                for (final int row : selectedRows) {
                    for (int col = 0; col < table.getColumnCount(); col++) {
                        data.append(table.getValueAt(row, col));
                        if (col < table.getColumnCount() - 1) {
                            data.append(",");
                        }
                    }
                    data.append("\n");
                }
                return new StringSelection(data.toString());
            }
        });

        // Enable drop into JTree
        tree.setDropMode(DropMode.ON_OR_INSERT);
        tree.setDragEnabled(true);
        tree.setTransferHandler(new TransferHandler() {
            @Override
            public boolean canImport(final TransferSupport support) {
                return support.isDataFlavorSupported(DataFlavor.stringFlavor);
            }

            @Override
            public boolean importData(final TransferSupport support) {
                if (!this.canImport(support)) {
                    return false;
                }

                final Transferable transferable = support.getTransferable();
                try {
                    final String data = (String) transferable.getTransferData(DataFlavor.stringFlavor);
                    final String[] rowData = data.split(",");
                    final DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(rowData[0]);
                    for (int i = 1; i < rowData.length; i++) {
                        final DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode(rowData[i]);
                        newNode.add(leafNode);
                    }
                    final DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
                    treeModel.insertNodeInto(newNode, root, root.getChildCount());
                    return true;
                } catch (UnsupportedFlavorException | IOException e) {
                    e.printStackTrace();
                    return false;
                }
            }
        });

        // Create and set layout
        final JPanel panel = new JPanel(new GridLayout(1, 2));
        panel.add(new JScrollPane(table));
        panel.add(new JScrollPane(tree));
        frame.add(panel);

        frame.setSize(600, 300);
        frame.setVisible(true);
    }
   
}
 

jowu

Neues Mitglied
Danke, das Beispiel bringt mich deutlich weiter. Es übertragt genau die selektierten Zeilen in den Baum. Bisher hatte ich alle möglichen Listener (MouseListener, DragGestureListener) an der JTable angehängt - ohne das es stabil lief.

Ich habe die innere Klasse TransferHandler aus Deiner Vorlage ausgelagert. Jetzt bleibt noch das Problem mit dem Transferable Objekt - wenn das kein String sein sein, muß ich wohl ein eigenes Transferable mit einem speziellen DataFlavor für meine Konten bauen, ich denke, das kriege ich dann auch bald hin.

Java:
import java.awt.GridLayout;
import javax.swing.DropMode;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

import dnd.TestTransferHandler;

public class Testaufruf
{
    public static void main(final String[] args)
    {
        final JFrame frame = new JFrame("Drag and Drop Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Create JTable with some sample data
        final String[] columnNames = {"Name", "Age", "Gender"};
        final Object[][] data = {
                {"Alice", 28, "Female"},
                {"Bob", 35, "Male"},
                {"Charlie", 20, "Male"},
                {"Diana", 42, "Female"}
        };
        
        final DefaultTableModel model = new DefaultTableModel( data, columnNames );
        
       // Create JTable
        final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        final JTable table = new JTable(model);
        table.setDragEnabled(true);

        // Create JTree       
        final DefaultTreeModel treeModel = new DefaultTreeModel(root);
 
       final JTree tree = new JTree(treeModel); 
       final TestTransferHandler myHandler = new TestTransferHandler( table, tree );
       
       tree.setDropMode(DropMode.ON_OR_INSERT);
       tree.setDragEnabled(true);        
       tree.setTransferHandler( myHandler );

        // Create and set layout
        final JPanel panel = new JPanel(new GridLayout(1, 2));
        panel.add(new JScrollPane(table));
        panel.add(new JScrollPane(tree));
        frame.add(panel);

        frame.setSize(600, 300);
        frame.setVisible(true);
    }
}

Java:
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.JComponent;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.TransferHandler;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

@SuppressWarnings("serial")
public class TestTransferHandler extends TransferHandler
{
    private final JTree myTree;
    private final JTable myTable;

    public TestTransferHandler( JTable p_table, JTree p_tree )
    {   
        this.myTree  = p_tree;
        this.myTable = p_table;
    }

    @Override
    public int getSourceActions(final JComponent c)
    {
        return TransferHandler.COPY;
    }
    
    @Override
    protected Transferable createTransferable( final JComponent c )
    {
        //Prüfen, ob ich das gleiche Objekt im Zugriff habe
        final JTable i_table = (JTable) c;
        if ( i_table.equals(myTable) )
            System.out.println( "Gleiche Table wie aus dem Konstruktor ");
        else
            System.out.println( "Unterschiedliche Table ");
        
        final int[] selectedRows = myTable.getSelectedRows();
        final StringBuilder data = new StringBuilder();
        
        for (final int row : selectedRows)
        {
            StringBuilder zeile = new StringBuilder();
            for ( int col = 0; col < myTable.getColumnCount(); col++ )
            {
                zeile.append( myTable.getValueAt(row, col) );
                if (col < myTable.getColumnCount() - 1)
                {
                    zeile.append(",");
                }
            }
            data.append( zeile + "\n");
        }
        return new StringSelection(data.toString());
    }
    
    @Override
    public boolean canImport(final TransferSupport support)
    {
        return support.isDataFlavorSupported(DataFlavor.stringFlavor);
    }   
    
    
    @Override
    public boolean importData( final TransferSupport support )
    {
        if (!this.canImport(support))
        {
            return false;
        }
        
        final Transferable transferable = support.getTransferable();
        try
        {
            final String data = (String) transferable.getTransferData(DataFlavor.stringFlavor);
            final String[] rowData = data.split( "\n" );
            
            final DefaultTreeModel treeModel = (DefaultTreeModel) myTree.getModel();
            DefaultMutableTreeNode root = (DefaultMutableTreeNode) treeModel.getRoot();
            
            for (int i = 0; i < rowData.length; i++)
            {
                System.out.println( "Einfügen: "+rowData[i] );
                final DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode( rowData[i] );
                treeModel.insertNodeInto(leafNode, root, root.getChildCount());
            }
            
            return true;
        }
        catch (UnsupportedFlavorException | IOException e)
        {
            e.printStackTrace();
            return false;
        }
    }   
    
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
B Swing Drag&Drop einzelner Zellen in einer JTable AWT, Swing, JavaFX & SWT 12
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
A Drag & Drop von Zeilen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 2
R Drag & Drop einer einzelnen Zelle (JTable) 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 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
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
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
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
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