如何区分 importData 中的复制/移动
Posted
技术标签:
【中文标题】如何区分 importData 中的复制/移动【英文标题】:How to distinguish between copy/move in importData 【发布时间】:2020-01-15 03:57:11 【问题描述】:我需要在拖放或复制/剪切和粘贴(复制与移动)期间获取操作类型。这是一个 Swing 应用程序,实现了TransferHandle
。我在操作结束时需要此信息,在 importData
方法中。
对于拖放,似乎可以测试getUserDropAction
,像这样
@Override
public boolean importData(final TransferSupport support)
if(support.isDrop() && support.getUserDropAction() == TransferHandler.MOVE)
// drag and drop, MOVE
...但是如何获取此信息以进行剪切/复制和粘贴?还是有更好的通用方法?
【问题讨论】:
【参考方案1】:也许您可以从包含一个工作示例的 Swing 教程中获得足够的提示:
CCP in a non-Text Component (The Java™ Tutorials > Creating a GUI With JFC/Swing > Drag and Drop and Data Transfer) ListTransferHandler.java是拖放还是复制/剪切粘贴可以通过TransferSupport#isDrop()
方法判断。
/**
* Perform the actual data import.
*/
public boolean importData(TransferHandler.TransferSupport info)
// ...
if (info.isDrop()) // This is a drop
// ...
else // This is a paste
// ...
使用TransferHandler#exportDone(...) 方法的int action
参数来确定是复制粘贴还是剪切粘贴。
由于使用TransferHandler#importData(...)
方法执行粘贴,覆盖粘贴完成后调用的TransferHandler#exportDone(...)
方法,如果参数的动作为TransferHandler.MOVE
,则剪切传输源数据。
如果操作不是TransferHandler.MOVE
,则无需执行任何操作,因为它是副本。
/**
* When the export is complete, remove the old list entry if the
* action was a move.
*/
protected void exportDone(JComponent c, Transferable data, int action)
if (action != MOVE)
return;
JList list = (JList)c;
DefaultListModel model = (DefaultListModel)list.getModel();
int index = list.getSelectedIndex();
model.remove(index);
【讨论】:
您的解决方案适用于区分键盘操作(剪切或复制)和鼠标操作(移动和复制)。但我需要一些不同的东西,正如我在主题中所写的:移动与复制。而且不是在exportDone
,而是在importData
(由于一些服务器通信)。以上是关于如何区分 importData 中的复制/移动的主要内容,如果未能解决你的问题,请参考以下文章