2009-03-12 16 views

答えて

4

Javaチュートリアルのdrag and dropのセクションをご覧ください。 JTableにこれを実装する方法の例がいくつかあります。

0

おそらくsth。このように:

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

以下は、単一のドラッグ行のJTableは再発注することができます:

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

あなたのTableModelが再配列を可能にするために、次の実装する必要があります。

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

をこのTransferHandlerクラスは、ドラッグ&ドロップを処理し、ジェスチャが完了したときにTableModelでreorder()を呼び出します。ただ、レコードと複数行の並べ替えのための

/** 
* 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'を変更して例外を受け取りました:' private final DataFlavor localObjectFlavor = new DataFlavor(Integer.class、 "Integer Row Index"); ' – Koobz

+0

+1残念ながら、これは複数行では機能しません選択。 – Stephan

+0

+1 - いくつかの簡単な変更とこれは完全に動作します! – pstanton

0

:どこか

使用が....

これは上記の回答でメインクラスです
JTable table = t_objects; 
    table.setDragEnabled(true); 
    table.setDropMode(DropMode.INSERT_ROWS); 
    table.setTransferHandler(new TableRowTransferHandler(table)); 

、私はそれが一致するように変更しました複数行のDnDの必要性 私がしたのは、最初に選択した行を使用してから、ドロップ先の上の行を計算することでした。選択された項目を削除し、それらをオブジェクトのリスト(行配列オブジェクト)に保持します。計算された行に戻します。最後に削除/ドラッグされた行を選択してプロセスを完了します。

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)); 
     } 
    } 
} 
関連する問題