テーブル内の別のインデックスに行をドラッグできるようにJTableを設定するにはどうすればよいですか?たとえば、5行があり、4行目を2番目の位置にドラッグしたいとしますか?JTableで行をドラッグアンドドロップするにはどうすればよいですか?
30
A
答えて
4
Javaチュートリアルのdrag and dropのセクションをご覧ください。 JTable
にこれを実装する方法の例がいくつかあります。
0
BasicTableUIまたはTransferableインターフェイスを参照してください。
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));
}
}
}
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));
}
}
}
関連する問題
- 1. JTableで行を選択するにはどうすればよいですか?
- 2. ファイルをアプリケーションにドラッグアンドドロップするにはどうすればよいですか?
- 3. ドラッグアンドドロップをキャンバスに実装するにはどうすればよいですか?
- 4. JTableでセルタイピングイベントを見つけるにはどうすればよいですか?
- 5. JTableにチェックボックスを追加するにはどうすればよいですか?
- 6. ArrayListをjtableに追加するにはどうすればよいですか?
- 7. 複数のアクティビティでドラッグアンドドロップするにはどうすればよいですか?
- 8. jQuery:コードのドラッグアンドドロップをシミュレートするにはどうすればよいですか?
- 9. 既存のJTableをメソッドのJTable結果に変換するにはどうすればよいですか?
- 10. JTableヘッダーを2行で印刷するにはどうすればよいですか?
- 11. ドラッグアンドドロップ中に表示されるビューをカスタマイズするにはどうすればよいですか?
- 12. JFrameでActionListenerを使用してJTableを更新するにはどうすればよいですか?
- 13. エクスプローラからWPFコントロールに画像をドラッグアンドドロップするにはどうすればよいですか?
- 14. テキストファイルからjtableにデータを取得するにはどうすればよいですか?
- 15. jTableのサイズをヘッダーなどの内容に合わせるにはどうすればよいですか?
- 16. JQueryのドラッグアンドドロップをTextBoxで使用するにはどうすればよいですか?
- 17. UIImageViewsの間で画像をドラッグアンドドロップするにはどうすればよいですか?
- 18. UWPアプリケーションのListView間でカスタムオブジェクトをドラッグアンドドロップするにはどうすればよいですか?
- 19. WPFでドラッグアンドドロップを正しく許可するにはどうすればよいですか?
- 20. DataGridviewで「自己」ドラッグアンドドロップを防止するにはどうすればよいですか?
- 21. C#WPFで2つのラベルのExchangeデータをドラッグアンドドロップするにはどうすればよいですか?
- 22. JTableで一度に1行だけを選択できるようにするにはどうすればよいですか?
- 23. JTableでテキストの継承の色を変更するにはどうすればよいですか?
- 24. Javaeditor jTableでセルのテキストを設定するにはどうすればよいですか?
- 25. JTableの行をどのようにフィルタリングできますか?
- 26. これをプログラムで行うにはどうすればよいですか?
- 27. ページリダイレクトでこれを行うにはどうすればよいですか?
- 28. C#でこれを行うにはどうすればよいですか?
- 29. 他のコンポーネントのリスナーからJTableのテーブルモデルを設定するにはどうすればよいですか?
- 30. SlickGirdでドラッグアンドドロップで列の並び替えを有効にするにはどうすればいいですか?
以下の回答のいずれかが役に立ちましたか? – Ascalonian