概要

JInternalFrame間でJTableの行をドラッグ&ドロップを使って入れ替えます。

サンプルコード

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の行をドラッグ&ドロップで入れ替え可能にしています。

  • 使用するTransferHandlerJTableの行を別のJTableにドラッグして移動のものとほぼ同等
  • 前面のJInternalFrame内にあるJTableからドラッグを開始した場合そのJTableHeaderJInternalFrameのタイトルバー上でも背面にあるJInternalFrameに反応してドロップ可能になってしまう
  • TransferHandler#canImport(...)をオーバーライドしてドラッグ元とドロップ先のJInternalFrameの重なる共通領域では背面にドロップ出来ないように変更

参考リンク

コメント