【问题标题】:How to distinguish between copy/move in importData如何区分 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
    }
}

...但是如何获取此信息以进行剪切/复制和粘贴?还是有更好的通用方法?

【问题讨论】:

    标签: java swing drag-and-drop


    【解决方案1】:

    也许您可以从包含一个工作示例的 Swing 教程中获得足够的提示:


    拖放还是复制/剪切粘贴可以通过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(由于一些服务器通信)。
    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2012-04-15
    • 2014-04-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多