Swing/InternalFrameDropTarget のバックアップソース(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/InternalFrameDropTarget へ行く。
--- title: JInternalFrame間でのドラッグ&ドロップによるJTableの行入れ替え tags: [JInternalFrame, JTable, DragAndDrop] author: aterai pubdate: 2014-05-19T00:37:47+09:00 description: JInternalFrame間でJTableの行をドラッグ&ドロップを使って入れ替えます。 --- * 概要 [#c77b8888] `JInternalFrame`間で`JTable`の行をドラッグ&ドロップを使って入れ替えます。 #download(https://lh5.googleusercontent.com/-UP_I_iTgtpc/U3jPL_jhwuI/AAAAAAAACFg/olJ1Sf-P_lU/s800/InternalFrameDropTarget.png) * サンプルコード [#g636ff99] #code(link){{ private boolean isDropableTableIntersection(TransferSupport info) { Component c = info.getComponent(); if (!(c instanceof JTable)) { return false; } JTable target = (JTable) c; if (!target.equals(source)) { JDesktopPane dp = null; Container cn = SwingUtilities.getAncestorOfClass(JDesktopPane.class, target); if (cn instanceof JDesktopPane) { dp = (JDesktopPane) cn; } JInternalFrame sf = getInternalFrame(source); JInternalFrame tf = getInternalFrame(target); if (sf == null || tf == null || dp.getIndexOf(tf) < dp.getIndexOf(sf)) { return false; } Point pt = SwingUtilities.convertPoint( target, info.getDropLocation().getDropPoint(), dp); Rectangle rect = sf.getBounds().intersection(tf.getBounds()); if (rect.contains(pt)) { return false; } //tf.moveToFront(); //tf.getParent().repaint(); } return true; } }} * 解説 [#e84166f0] 上記のサンプルでは、異なる`JInternalFrame`に配置した`JTable`の行をドラッグ&ドロップで入れ替えています。使用する`TransferHandler`は[[JTableの行を別のJTableにドラッグして移動>Swing/DragRowsAnotherTable]]のものとほぼ同じですが、前面の`JInternalFrame`内にある`JTable`からドラッグした場合、その`JTableHeader`や`JInternalFrame`のタイトルバー上でも、背面にある`JInternalFrame`に反応してドロップ可能になってしまうため、`TransferHandler#canImport(...)`をオーバーライドして、ドラッグ元とドロップ先の`JInternalFrame`の共通部分では背面にドロップ出来ないように変更しています。 * 参考リンク [#yecd2047] - [[JTableの行を別のJTableにドラッグして移動>Swing/DragRowsAnotherTable]] * コメント [#te2322ff] #comment #comment