JListでマウスドラッグとクリップボード経由のアイテム移動が可能かを個別に設定する
Total: 694
, Today: 4
, Yesterday: 9
Posted by aterai at
Last-modified:
概要
TransferHandler
を設定したJList
でマウスドラッグ、またはクリップボード経由のアイテム移動を許可するかどうかを切り替えます。
Screenshot
Advertisement
サンプルコード
@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) {
Object o = comp.getClientProperty("canExportToClipboard");
if (Objects.equals(o, Boolean.TRUE)) {
super.exportToClipboard(comp, clip, action);
}
}
View in GitHub: Java, Kotlin解説
canExportAsDrag
- マウスドラッグによるリストアイテム移動の可・不可を切り替える
- TransferHandler#exportAsDrag(...)をオーバーライドしてドラッグ元の
JList
にClientProperty
でcanExportAsDrag
が設定されているかどうかで判断 - ドラッグ開始可能かを判断し、ドロップ可能かは無関係
canExportToClipboard
- リストアイテムをCtrl+Cでコピー、Ctrl+Xのカットが可能かを切り替える
- TransferHandler#exportToClipboard(...)をオーバーライドしてコピー(カット)元の
JList
にClientProperty
でcanExportToClipboard
が設定されているかどうかで判断 - Ctrl+Vでのペーストの可・不可は
TransferHandler#exportToClipboard(...)
のオーバーライドでは設定できない
canImportFromClipboard
- リストアイテムを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[])
メソッドはマウスでのドラッグ&ドロップ時にのみ実行されてペースト時には実行されない
- 以下のように空のアクションを設定することでコピー、カット、ペーストのみ無効にする方法もある
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);