2009-03-12 16 views

cevap

4

kontrol edin. Bunu, JTable için nasıl uygulayacağınıza dair bazı örnekler vardır.

0

belki sth. Böyle:

table.addMouseMotionListener(new MouseMotionListener() { 
    public void mouseDragged(MouseEvent e) { 
     e.consume(); 
     JComponent c = (JComponent) e.getSource(); 
     TransferHandler handler = c.getTransferHandler(); 
     handler.exportAsDrag(c, e, TransferHandler.MOVE); 
    } 

    public void mouseMoved(MouseEvent e) { 
    } 
}); 
55

şu sağlayan bir tek sürüklenen satırın JTable yeniden sıralama:

public interface Reorderable { 
    public void reorder(int fromIndex, int toIndex); 
} 

:

table.setDragEnabled(true); 
    table.setDropMode(DropMode.INSERT_ROWS); 
    table.setTransferHandler(new TableRowTransferHandler(table)); 

Sizin TableModel yeniden sipariş için izin vermek için aşağıdaki uygulamalıdır Bu TransferHandler sınıf sürükle & damla kolları ve jest tamamlandığında çağrılar TableModel üzerinde() yeniden düzenlemek. Sadece kayıtları ve çoklu satır yeniden sipariş için

/** 
* Handles drag & drop row reordering 
*/ 
public class TableRowTransferHandler extends TransferHandler { 
    private final DataFlavor localObjectFlavor = new ActivationDataFlavor(Integer.class, "application/x-java-Integer;class=java.lang.Integer", "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) || (act == TransferHandler.NONE)) { 
     table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 

} 
+1

"localObjectFlavor" ifadesini "özel son DataFlavor localObjectFlavor = yeni DataFlavor (Integer.class," Tamsayı Sıra Dizini ") olarak değiştirerek sabitlediğim aktarımda istisnalar alıyordum; – Koobz

+0

+1 Ancak maalesef bu birden çok satır için çalışmayacak seçimi. – Stephan

+0

+1 - birkaç basit değişiklik ve bu mükemmel çalışıyor! – pstanton

0

: yere

kullanım ....

Bu, yukarıdaki yanıtında ana sınıftır
JTable table = t_objects; 
    table.setDragEnabled(true); 
    table.setDropMode(DropMode.INSERT_ROWS); 
    table.setTransferHandler(new TableRowTransferHandler(table)); 

, bunu maç için modifiye çoklu satır DnD için ihtiyaçlar. Tek yaptığım, seçilen ilk satırı kullanıp, açılan yerin üzerindeki satırları hesaplamak. Seçilen öğeleri kaldır ve onları bir nesne listesinde tut (satır dizisi nesnesi). sonra bunları hesaplanan satırlara geri yerleştirin. ve sonunda işlemi tamamlamak için kaldırılan/sürüklenen satırları seçin.

public class TableRowTransferHandler extends TransferHandler { 

    private final DataFlavor localObjectFlavor = new DataFlavor(Integer.class, "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) { 

       int[] rows = table.getSelectedRows(); 
       int dist = 0; 
       for (int row : rows) { 
        if (index > row) { 
         dist++; 
        } 
       } 
       index -= dist; 

       //**TableUtil** is a simple class that just copy, remove and select rows. 

       ArrayList<Object> list = TableUtil.getSelectedList(table); 
       TableUtil.removeSelected(table); 
       ArrayList<Integer> sels = new ArrayList<Integer>(); 
       for (Object obj : list) { 
        sels.add(index); 
        TableUtil.addRowAt(table, obj, index++); 
       } 
       TableUtil.selectMultipleRow(table, sels); 


       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)); 
     } 
    } 
} 
İlgili konular