Swing/DnDTable のバックアップ差分(No.13)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DnDTable へ行く。
- 1 (2007-04-02 (月) 16:29:09)
- 2 (2007-04-03 (火) 15:01:35)
- 3 (2007-08-21 (火) 13:13:10)
- 4 (2009-11-16 (月) 10:53:32)
- 5 (2010-03-08 (月) 12:30:36)
- 6 (2010-03-08 (月) 13:42:39)
- 7 (2011-03-04 (金) 15:01:42)
- 8 (2011-03-29 (火) 09:26:39)
- 9 (2013-02-09 (土) 23:49:23)
- 10 (2013-05-03 (金) 23:48:34)
- 11 (2014-09-30 (火) 01:04:55)
- 12 (2014-12-03 (水) 00:27:03)
- 13 (2016-01-27 (水) 18:20:16)
- 14 (2016-05-22 (日) 21:25:46)
- 15 (2016-05-26 (木) 01:05:18)
- 16 (2016-05-26 (木) 14:47:08)
- 17 (2016-10-28 (金) 21:55:46)
- 18 (2017-11-15 (水) 15:50:55)
- 19 (2018-05-30 (水) 20:16:33)
- 20 (2019-10-15 (火) 17:32:35)
- 21 (2021-05-19 (水) 05:41:38)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- title: JTableの行をドラッグ&ドロップ tags: [JTable, DragAndDrop] author: aterai pubdate: 2007-04-02T16:29:09+09:00 description: JTableの行をドラッグ&ドロップで入れ替えます。 description: JTableの行を選択し、その順序をドラッグ&ドロップで入れ替えます。 --- * 概要 [#a9cb5120] `JTable`の行をドラッグ&ドロップで入れ替えます。 `JTable`の行を選択し、その順序をドラッグ&ドロップで入れ替えます。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTLl0NAFoI/AAAAAAAAAX0/su1r-c7f4V0/s800/DnDTable.png) * サンプルコード [#bea7b546] #code(link){{ class DnDTable extends JTable implements DragGestureListener, Transferable { private static final String NAME = "test"; private static final DataFlavor FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType, NAME); private static final Color LINE_COLOR = new Color(255, 100, 100); private final Rectangle2D targetLine = new Rectangle2D.Float(); private int draggedIndex = -1; private int targetIndex = -1; public DnDTable(TableModel model) { super(model); //DropTarget dropTarget = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, new CDropTargetListener(), true); //DragSource dragSource = new DragSource(); new DragSource().createDefaultDragGestureRecognizer( (Component) this, DnDConstants.ACTION_COPY_OR_MOVE, (DragGestureListener) this); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (targetIndex >= 0) { Graphics2D g2 = (Graphics2D) g.create(); g2.setPaint(LINE_COLOR); g2.fill(targetLine); g2.dispose(); } } private void initTargetLine(Point p) { Rectangle2D testArea = new Rectangle2D.Float(); int cellHeight = getRowHeight(); int lineWidht = getWidth(); int lineHeight = 2; int modelSize = getRowCount(); targetIndex = -1; for (int i = 0; i < modelSize; i++) { testArea.setRect( 0, cellHeight * i - cellHeight / 2, lineWidht, cellHeight); if (testArea.contains(p)) { targetIndex = i; targetLine.setRect(0, i * cellHeight, lineWidht, lineHeight); break; } } if (targetIndex < 0) { targetIndex = modelSize; targetLine.setRect( 0, targetIndex * cellHeight - lineHeight, lineWidht, lineHeight); } } // Interface: DragGestureListener @Override public void dragGestureRecognized(DragGestureEvent e) { if (getSelectedRowCount() > 1) { return; } draggedIndex = rowAtPoint(e.getDragOrigin()); if (draggedIndex < 0) { return; } try { e.startDrag(DragSource.DefaultMoveDrop, (Transferable) this, new TableDragSourceListener()); } catch (InvalidDnDOperationException idoe) { idoe.printStackTrace(); } } // Interface: Transferable @Override public Object getTransferData(DataFlavor flavor) { return this; } @Override public DataFlavor[] getTransferDataFlavors() { DataFlavor[] f = new DataFlavor[1]; f[0] = this.FLAVOR; return f; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.getHumanPresentableName().equals(NAME); } class CDropTargetListener implements DropTargetListener { @Override public void dragExit(DropTargetEvent e) { targetIndex = -1; repaint(); } @Override public void dragEnter(DropTargetDragEvent e) { if (isDragAcceptable(e)) { e.acceptDrag(e.getDropAction()); } else { e.rejectDrag(); } } @Override public void dragOver(final DropTargetDragEvent e) { if (isDragAcceptable(e)) { e.acceptDrag(e.getDropAction()); setCursor(DragSource.DefaultMoveDrop); } else { e.rejectDrag(); setCursor(DragSource.DefaultMoveNoDrop); return; } initTargetLine(e.getLocation()); repaint(); } @Override public void dropActionChanged(DropTargetDragEvent e) { // if (isDragAcceptable(e)) { e.acceptDrag(e.getDropAction()); } // else e.rejectDrag(); } @Override public void drop(DropTargetDropEvent e) { DefaultTableModel model = (DefaultTableModel) getModel(); if (isDropAcceptable(e)) { if (targetIndex == draggedIndex) { setRowSelectionInterval(targetIndex, targetIndex); } else { int tg = targetIndex < draggedIndex ? targetIndex : targetIndex - 1; model.moveRow(draggedIndex, draggedIndex, tg); setRowSelectionInterval(tg, tg); } e.dropComplete(true); } else { e.dropComplete(false); } e.dropComplete(false); setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); targetIndex = -1; repaint(); } private boolean isDragAcceptable(DropTargetDragEvent e) { DataFlavor[] f = e.getCurrentDataFlavors(); return isDataFlavorSupported(f[0]); } private boolean isDropAcceptable(DropTargetDropEvent e) { Transferable t = e.getTransferable(); DataFlavor[] f = t.getTransferDataFlavors(); return isDataFlavorSupported(f[0]); } } } }} * 解説 [#weac537f] ドラッグソースとドラッグターゲットをどちらも`JTable`にして、行の入れ替えがドラッグ&ドロップで出来るようになっています。 このサンプルのドラッグ&ドロップの手順は、行の入れ替え処理などを除けば、[[JListの項目をドラッグ&ドロップ>Swing/DnDList]]とほぼ同一です。 - 複数行を選択しての移動には対応していません。 -- `Java 1.6.0`以上で複数行選択して移動する方法: [[TransferHandlerを使ってJTableの行をドラッグ&ドロップ、並べ替え>Swing/DnDReorderTable]] * 参考リンク [#cef5dec4] - [[JListの項目をドラッグ&ドロップ>Swing/DnDList]] - [[JTable自体の高さを拡張>Swing/FillsViewportHeight]] - [[TransferHandlerを使ってJTableの行をドラッグ&ドロップ、並べ替え>Swing/DnDReorderTable]] - [[JTableの行を別のJTableにドラッグして移動>Swing/DragRowsAnotherTable]] * コメント [#icf126b7] #comment #comment