• category: swing folder: ExportAsDragOrExportToClipboard title: JListでマウスドラッグとクリップボード経由のアイテム移動が可能かを個別に設定する tags: [TransferHandler, DnD, JList] author: aterai pubdate: 2023-05-29T04:25:09+09:00 description: TransferHandlerを設定したJListでマウスドラッグ、またはクリップボード経由のアイテム移動を許可するかどうかを切り替えます。 image: https://drive.google.com/uc?id=

概要

TransferHandlerを設定したJListでマウスドラッグ、またはクリップボード経由のアイテム移動を許可するかどうかを切り替えます。

サンプルコード

@Override public void exportAsDrag(JComponent comp, InputEvent e, int action) {
  Object o = comp.getClientProperty("canExportAsDrag");
  if (Objects.equals(o, Boolean.TRUE)) {
    super.exportAsDrag(comp, e, action);
  }
}

@Override public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException {
  Object o = comp.getClientProperty("canExportToClipboard");
  if (Objects.equals(o, Boolean.TRUE)) {
    super.exportToClipboard(comp, clip, action);
  }
}
View in GitHub: Java, Kotlin

解説

  • canExportAsDrag
    • マウスドラッグによるリストアイテム移動の可・不可を切り替える
    • TransferHandler#exportAsDrag(...)をオーバーライドしてドラッグ元のJListClientPropertycanExportAsDragが設定されているかどうかで判断
    • ドラッグ開始可能かを判断し、ドロップ可能かは無関係
  • canExportToClipboard
    • リストアイテムをCtrl+Cでコピー、Ctrl+Xのカットが可能かを切り替える
    • TransferHandler#exportToClipboard(...)をオーバーライドしてコピー(カット)元のJListClientPropertycanExportToClipboardが設定されているかどうかで判断
    • Ctrl+Vでのペーストの可・不可はTransferHandler#exportToClipboard(...)のオーバーライドでは設定できない
  • canImportFromClipboard
    • リストアイテムをCtrl+Vでペースト可能かを切り替える
    • TransferHandler#importData(TransferHandler.TransferSupport)をオーバーライドして、TransferHandler.TransferSupport#isDrop() == trueではない、かつペースト先のJListClientPropertycanImportFromClipboardが設定されているかどうかで判断
      • TransferHandler#importData(JComponent, Transferable)TransferHandler#canImport(TransferHandler.TransferSupport)TransferHandler#canImport(JComponent, DataFlavor[])メソッドはマウスでのドラッグ&ドロップ時にのみ実行されてペースト時には実行されない

  • 以下のように空のアクションを設定することでコピー、カット、ペーストのみ無効にする方法もある
    ActionMap am = list.getActionMap();
    Action empty = new AbstractAction() {
      @Override public void actionPerformed(ActionEvent e) {
        /* do nothing */
      }
    };
    am.put(TransferHandler.getCutAction().getValue(Action.NAME), empty);
    am.put(TransferHandler.getCopyAction().getValue(Action.NAME), empty);
    am.put(TransferHandler.getPasteAction().getValue(Action.NAME), empty);
    

参考リンク

コメント