tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
718
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    pyr0t0n pyr0t0n ist offline Mitglied Brokat
    Registriert seit
    Sep 2002
    Ort
    Herten
    Beiträge
    258
    Hallo zusammen,

    ich muss in einem JTable einen Drag and Drop von mehreren Zellen bewerkstelligen.
    Drag and Drop für eine Zelle habe ich über einen Table Handler und Überschreiben der Methoden

    Code :
    1
    
    protected Transferable createTransferable(JComponent c)

    und

    Code :
    1
    
     public boolean importData(JComponent comp, Transferable t)

    bereits hinbekommen, ich kann zwar in der Funktion createTransferable meine makierten Zellen auslesen aber diese ja dann nicht an importData übergeben da ich kein Array von Transferable Objekten dahin übertragen kann.

    Wie kann ich das ganze nun Lösen?

    Danke schonmal für eure Hilfe.
     
    ****ie

  2. #2
    Avatar von miffi
    miffi miffi ist offline Mitglied Gold
    Registriert seit
    Jul 2009
    Ort
    Ravensburg (BW)
    Beiträge
    139
    Howdie.

    Für solche Sachen bieten sich eigene Transfer-Objekte an, dann bist du flexibel damit, was genau du per DnD verschiebst. Vermutlich hast du das Transferable-Interface momentan bei den Objekten in der Tabelle implementiert. Das lässt sich dann auf eine einzige Klasse beschränken. Hier ein Beispiel:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    public class TestTransfer implements Transferable{
     
        private DataFlavor[]   dataFlavors = new DataFlavor[]{new TestFlavor()};
        private ArrayList<TestObject>  testObjectList = null;
        
        public TestTransfer(ArrayList<TestObject> testObjectList){
            this.testObjectList = testObjectList;
        }
        
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            return this.testObjectList;
        }
     
        public boolean isDataFlavorSupported(DataFlavor flavor){
            for (DataFlavor dataFlavor : this.dataFlavors) {
                if(dataFlavor.equals(flavor)){
                    return true;
                }
            }
            return false;
        }
     
        public DataFlavor[] getTransferDataFlavors() {
            return this.dataFlavors;
        }
    }
    Dann kannst du im Transferhandler einfach ein solches Transfer-Objekt mit gesammelten Tabellen-Einträgen zusammenschieben:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    protected Transferable createTransferable(JComponent c) {
            ArrayList<TestObject> toList = new ArrayList<TestObject>();
            int[] selectedRows = this.myTable.getSelectedRows();
            for (int i : selectedRows) {
                Object selectedObject = this.myTable.getValueAt(i, 0);
                if (selectedObject instanceof TestObject) {
                    toList.add((TestObject)selectedObject);
                }
            }
            return new TestTransfer(toList);
        }

    Gruß
    miffi
     
    "A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
    Douglas Adams

  3. #3
    pyr0t0n pyr0t0n ist offline Mitglied Brokat
    Registriert seit
    Sep 2002
    Ort
    Herten
    Beiträge
    258
    Hallo,

    ja so ähnlich habe ich das ja, also ich habe einen Transfer Handler bzw. eine Klasse die von TransferHandler extended wird.

    Hier mal die Klasse.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    
    public class TableHandler extends TransferHandler
    {
      JTable  myTable;
      int row_old = 0;
      int col_old = 0;
      
      public TableHandler(JTable table)
      {
        myTable = table;
        myTable.setTransferHandler(this);
        myTable.setDragEnabled(true);
      }
     
        @Override
      public boolean canImport(JComponent comp, DataFlavor[] transferFlavors)
      {
        if (myTable != comp) return false;
        // eventuell DataFlavor noch prüfen
        return true;
      }
     
        @Override
      protected Transferable createTransferable(JComponent c)
      {
        if (c == myTable)
        {
          int row = myTable.getSelectedRow();
          int col = myTable.getSelectedColumn();
          row_old = row;
          col_old = col;
          Object value = myTable.getModel().getValueAt(row, col);
          return new TransferableObject(value);
        }
        else
        {
          return super.createTransferable(c);
        }
      }
     
        @Override
      public boolean importData(JComponent comp, Transferable t)
      {
        if (comp == myTable)
        {
          try
          {
            Object value = t.getTransferData(TransferableObject.FLAVOR);
            int row = myTable.getSelectedRow();
            int col = myTable.getSelectedColumn();
            myTable.getModel().setValueAt(value,row, col);
            Event ev = (Event)myTable.getModel().getValueAt(row, col);
            if(ev.getDauerTage() > 1) {
                for(int i = 1; i < ev.getDauerTage(); i++) {
                    myTable.getModel().setValueAt(myTable.getModel().getValueAt(row_old, col_old + i), row, col + i);
                    myTable.getModel().setValueAt(null, row_old, col_old + i);
                }
            }
            ev.setRow(row);
            myTable.getModel().setValueAt(null, row_old, col_old);
            return true;
          }
          catch (Exception e)
          {
          }
        }
        return super.importData(comp, t);
      }
     
        @Override
      public int getSourceActions(JComponent c)
      {
        if (myTable == c) return DnDConstants.ACTION_MOVE;
        else return super.getSourceActions(c);
      }
     
    }

    Und überschreibe da ja die beiden oben genannten Methoden.
    Doch wenn ich diese ändere das Array zurückgegeben und übergeben werden kann ich ja nicht mehr hingehen und die Original Methode des TransferHandlers überschreiben.

    Ich hoffe du verstehst meine Problematik, wobei ich mittlerweile fast glaube das es da einen einfacheren Weg gibt.
     
    ****ie

Ähnliche Themen

  1. Drag and Drop mit mehreren Zeilen
    Von Christian030783 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 20.09.10, 08:39
  2. JTable Drag and Drop (DnD) --> Excel anderes Zahlenformat
    Von ThirdKeeper im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 8
    Letzter Beitrag: 23.03.09, 16:15
  3. JList to JTable Drag and Drop
    Von Ryu20 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 25.03.08, 23:30
  4. JTable und Drag&Drop
    Von MuhMau im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 21.06.07, 13:02
  5. SWT: Ghosted Drag-Image bei Drag & Drop
    Von snake_plissken im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 15.04.06, 23:36

Stichworte