Swing/DnDTable のバックアップの現在との差分(No.10)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - 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の行をドラッグ&ドロップ #navi(../) #tags(JTable, DragAndDrop) RIGHT:Posted by &author(aterai); at 2007-04-02 *JTableの行をドラッグ&ドロップ [#a9cb5120] ``JTable``の行をドラッグ&ドロップで入れ替えます。 --- category: swing folder: DnDTable title: JTableの行をドラッグ&ドロップ tags: [JTable, DragAndDrop] author: aterai pubdate: 2007-04-02T16:29:09+09:00 description: JTableの行を選択し、その順序をドラッグ&ドロップで入れ替えます。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTLl0NAFoI/AAAAAAAAAX0/su1r-c7f4V0/s800/DnDTable.png --- * 概要 [#summary] `JTable`の行を選択し、その順序をドラッグ&ドロップで入れ替えます。 -&jnlp; -&jar; -&zip; #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTLl0NAFoI/AAAAAAAAAX0/su1r-c7f4V0/s800/DnDTable.png) //#screenshot #ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTLl0NAFoI/AAAAAAAAAX0/su1r-c7f4V0/s800/DnDTable.png) **サンプルコード [#bea7b546] * サンプルコード [#sourcecode] #code(link){{ class DnDTable extends JTable implements DragGestureListener, DragSourceListener, Transferable { class DnDTable extends JTable implements DragGestureListener, Transferable { private static final String NAME = "test"; private static final Color lineColor = new Color(255,100,100); private Rectangle2D targetLine = new Rectangle2D.Float(); 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(); dragSource.createDefaultDragGestureRecognizer((Component)this, DnDConstants.ACTION_COPY_OR_MOVE, (DragGestureListener)this); //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) { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if(targetIndex>=0) { Graphics2D g2 = (Graphics2D)g; g2.setPaint(lineColor); 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 lineWidth = 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)) { for (int i = 0; i < modelSize; i++) { testArea.setBounds( 0, cellHeight * i - cellHeight / 2, lineWidth, cellHeight); if (testArea.contains(p)) { targetIndex = i; targetLine.setRect(0, i*cellHeight, lineWidht, lineHeight); targetLine.setBounds(0, i * cellHeight, lineWidth, lineHeight); break; } } if(targetIndex<0) { if (targetIndex < 0) { targetIndex = modelSize; targetLine.setRect(0, targetIndex*cellHeight-lineHeight, lineWidht, lineHeight); targetLine.setBounds( 0, targetIndex * cellHeight - lineHeight, lineWidth, lineHeight); } } // Interface: DragGestureListener @Override public void dragGestureRecognized(DragGestureEvent e) { if(getSelectedRowCount()>1) return; if (getSelectedRowCount() > 1) { return; } draggedIndex = rowAtPoint(e.getDragOrigin()); if(draggedIndex<0) return; try{ e.startDrag(DragSource.DefaultMoveDrop, (Transferable)this, (DragSourceListener)this); }catch(InvalidDnDOperationException idoe) {} if (draggedIndex < 0) { return; } try { e.startDrag(DragSource.DefaultMoveDrop, (Transferable) this, new TableDragSourceListener()); } catch (InvalidDnDOperationException idoe) { idoe.printStackTrace(); } } // Interface: DragSourceListener @Override public void dragEnter(DragSourceDragEvent e) { e.getDragSourceContext().setCursor(DragSource.DefaultMoveDrop); } @Override public void dragExit(DragSourceEvent e) { e.getDragSourceContext().setCursor(DragSource.DefaultMoveNoDrop); } @Override public void dragOver(DragSourceDragEvent e) {} @Override public void dropActionChanged(DragSourceDragEvent e) {} @Override public void dragDropEnd(DragSourceDropEvent e) {} // Interface: Transferable private final DataFlavor FLAVOR = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType, NAME); @Override public Object getTransferData(DataFlavor flavor) { return this; } @Override public DataFlavor[] getTransferDataFlavors() { DataFlavor[] f = new DataFlavor[1]; f[0] = this.FLAVOR; return f; return new DataFlavor[] {FLAVOR}; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.getHumanPresentableName().equals(NAME); } class CDropTargetListener implements DropTargetListener{ // DropTargetListener interface class CDropTargetListener implements DropTargetListener { @Override public void dragExit(DropTargetEvent e) { targetIndex = -1; repaint(); } @Override public void dragEnter(DropTargetDragEvent e) { if(isDragAcceptable(e)) { if (isDragAcceptable(e)) { e.acceptDrag(e.getDropAction()); }else{ } else { e.rejectDrag(); } } @Override public void dragOver(final DropTargetDragEvent e) { if(isDragAcceptable(e)) { if (isDragAcceptable(e)) { e.acceptDrag(e.getDropAction()); }else{ 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()); // if (isDragAcceptable(e)) { e.acceptDrag(e.getDropAction()); } // else e.rejectDrag(); } @Override public void drop(DropTargetDropEvent e) { DefaultTableModel model = (DefaultTableModel)getModel(); Transferable t = e.getTransferable(); DataFlavor[] f = t.getTransferDataFlavors(); try { if(isDropAcceptable(e)) { Component comp = (Component) t.getTransferData(f[0]); 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); 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); } }catch(UnsupportedFlavorException ex) { e.dropComplete(true); } else { e.dropComplete(false); }catch(IOException ie) { e.dropComplete(false); } e.dropComplete(false); setCursor(Cursor.getDefaultCursor()); targetIndex = -1; repaint(); } public boolean isDragAcceptable(DropTargetDragEvent e) { private boolean isDragAcceptable(DropTargetDragEvent e) { DataFlavor[] f = e.getCurrentDataFlavors(); return isDataFlavorSupported(f[0]); } public boolean isDropAcceptable(DropTargetDropEvent e) { private boolean isDropAcceptable(DropTargetDropEvent e) { Transferable t = e.getTransferable(); DataFlavor[] f = t.getTransferDataFlavors(); return isDataFlavorSupported(f[0]); } } } }} **解説 [#weac537f] ドラッグソースとドラッグターゲットをどちらも``JTable``にして、行の入れ替えがドラッグ&ドロップで出来るようになっています。 * 解説 [#explanation] ドラッグソースとドラッグターゲットをどちらも`JTable`にして、行の入れ替えがドラッグ&ドロップで可能になっています。 このサンプルのドラッグ&ドロップの手順は、行の入れ替え処理などを除けば、[[JListの項目をドラッグ&ドロップ>Swing/DnDList]]とほぼ同一です。 このサンプルのドラッグ&ドロップの手順は、行の入れ替え処理などを除けば[[JListの項目をドラッグ&ドロップ>Swing/DnDList]]と同等です。 - 複数行を選択しての移動には対応していません。 -- ``Java 1.6.0``以上で複数行選択して移動する方法: [[TransferHandlerを使ってJTableの行をドラック&ドロップ、並べ替え>Swing/DnDReorderTable]] **参考リンク [#cef5dec4] * 参考リンク [#reference] - [[JListの項目をドラッグ&ドロップ>Swing/DnDList]] - [[JTable自体の高さを拡張>Swing/FillsViewportHeight]] - [[TransferHandlerを使ってJTableの行をドラック&ドロップ、並べ替え>Swing/DnDReorderTable]] - [[TransferHandlerを使ってJTableの行をドラッグ&ドロップ、並べ替え>Swing/DnDReorderTable]] -- `Java 1.6.0`以上で複数行を選択して移動を行う場合のサンプル - [[JTableの行を別のJTableにドラッグして移動>Swing/DragRowsAnotherTable]] - [[JTree間でのドラッグ&ドロップによるノードの移動>Swing/DnDBetweenTrees]] **コメント [#icf126b7] * コメント [#comment] #comment #comment