如何区分 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 中的复制/移动的主要内容,如果未能解决你的问题,请参考以下文章

移动IM开发指南3:如何优化登录模块

移动IM开发指南1:如何进行技术选型

移动IM开发指南2:心跳指令详解

如何检测手机或移动设备? [复制]

如何区分代码中颤振中的调试和发布模式? [复制]

matlab中的importdata和 load 的区别在哪