JInternalFrame間でのドラッグ&ドロップによるJTableの行入れ替え
Total: 4030
, Today: 2
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JInternalFrame
間でJTable
の行をドラッグ&ドロップを使って入れ替えます。
Screenshot
Advertisement
サンプルコード
private boolean isDroppableTableIntersection(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;
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、異なるJInternalFrame
に配置したJTable
の行をドラッグ&ドロップで入れ替え可能にしています。
- 使用する
TransferHandler
はJTableの行を別のJTableにドラッグして移動のものとほぼ同等 - 前面の
JInternalFrame
内にあるJTable
からドラッグを開始した場合そのJTableHeader
やJInternalFrame
のタイトルバー上でも背面にあるJInternalFrame
に反応してドロップ可能になってしまう TransferHandler#canImport(...)
をオーバーライドしてドラッグ元とドロップ先のJInternalFrame
の重なる共通領域では背面にドロップ出来ないように変更