文档

Java™ 教程
隐藏目录
将其整合 - DnD和CCP
教程:使用Swing创建GUI
课程:拖放和数据传输

整合所有内容 - DnD和CCP

我们已经展示了如何实现拖放支持和如何实现剪切、复制、粘贴支持。如何在一个组件中将两者结合起来呢?

你可以在TransferHandlerimportData方法中同时实现两者,像这样:

if (transferSupport.isDrop()) {
    // 将数据放入 transferSupport.getDropLocation() 中
} else {
    // 确定你想要粘贴的位置(例如:当前选择之后)
    // 将数据放在那里
}

非文本组件中的CCP页面上讨论的ListCutPaste示例支持拖放和CCP。这是它的importData方法(将if-else的拖放逻辑标记为粗体):

    public boolean importData(TransferHandler.TransferSupport info) {
        String data = null;

        // 如果我们不能处理导入数据,立即退出。
        if (!canImport(info)) {
            return false;
        }

        JList list = (JList)info.getComponent();
        DefaultListModel model = (DefaultListModel)list.getModel();
        // 获取数据,如果失败则退出
        try {
            data = (String)info.getTransferable().getTransferData(DataFlavor.stringFlavor);
        } catch (UnsupportedFlavorException ufe) {
            System.out.println("importData: 不支持的数据格式");
            return false;
        } catch (IOException ioe) {
            System.out.println("importData: I/O 异常");
            return false;
        }

        if (info.isDrop()) { // 这是一个拖放操作
            JList.DropLocation dl = (JList.DropLocation)info.getDropLocation();
            int index = dl.getIndex();
            if (dl.isInsert()) {
                model.add(index, data);
                return true;
            } else {
                model.set(index, data);
                return true;
            }
        } else { // 这是一个粘贴操作
            int index = list.getSelectedIndex();
            // 如果有有效的选择,
            // 在选择之后插入数据
            if (index >= 0) {
                model.add(list.getSelectedIndex()+1, data);
            // 否则追加到列表末尾
            } else {
                model.addElement(data);
            }
            return true;
        }
    }

这是你唯一需要安装if-else逻辑以区分拖放和CCP的地方。


上一页:使用和创建DataFlavor
下一页:解决常见的数据传输问题