Swing/ExportAsDragOrExportToClipboard のバックアップソース(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- バックアップ を表示
- Swing/ExportAsDragOrExportToClipboard へ行く。
- 1 (2023-05-29 (月) 04:30:58)
- 2 (2023-05-29 (月) 16:52:58)
- 3 (2023-10-10 (火) 10:46:10)
- 4 (2023-10-24 (火) 22:45:02)
--- 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=1wp4ANGfODIJb47xCpCoT7OSVL7783dR8 --- * 概要 [#summary] `TransferHandler`を設定した`JList`でマウスドラッグ、またはクリップボード経由のアイテム移動を許可するかどうかを切り替えます。 #download(https://drive.google.com/uc?id=1wp4ANGfODIJb47xCpCoT7OSVL7783dR8) * サンプルコード [#sourcecode] #code(link){{ @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); } } }} * 解説 [#explanation] - `canExportAsDrag` -- マウスドラッグによるリストアイテム移動の可・不可を切り替える -- `TransferHandler#exportAsDrag(...)`をオーバーライドしてドラッグ元の`JList`に`ClientProperty`で`canExportAsDrag`が設定されているかどうかで判断 -- ドラッグ開始可能かを判断し、ドロップ可能かは無関係 - `canExportToClipboard` -- リストアイテムをKBD{Ctrl+C}でコピー、KBD{Ctrl+X}のカットが可能かを切り替える -- `TransferHandler#exportToClipboard(...)`をオーバーライドしてコピー(カット)元の`JList`に`ClientProperty`で`canExportToClipboard`が設定されているかどうかで判断 -- KBD{Ctrl+V}でのペーストの可・不可は`TransferHandler#exportToClipboard(...)`のオーバーライドでは設定できない - `canImportFromClipboard` -- リストアイテムをKBD{Ctrl+V}でペースト可能かを切り替える -- `TransferHandler#importData(TransferHandler.TransferSupport)`をオーバーライドして、`TransferHandler.TransferSupport#isDrop() == true`ではない、かつペースト先の`JList`に`ClientProperty`で`canImportFromClipboard`が設定されているかどうかで判断 --- `TransferHandler#importData(JComponent, Transferable)`や`TransferHandler#canImport(TransferHandler.TransferSupport)`、`TransferHandler#canImport(JComponent, DataFlavor[])`メソッドはマウスでのドラッグ&ドロップ時にのみ実行されてペースト時には実行されない ---- - 以下のように空のアクションを設定することでコピー、カット、ペーストのみ無効にする方法もある #code{{ 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); }} * 参考リンク [#reference] - [[JList間でのコピー&ペーストによるアイテムの移動>Swing/ExportToClipboard]] * コメント [#comment] #comment #comment