这些Java教程是为JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参见JDK发行说明。
我们已经展示了如何实现拖放支持和如何实现剪切、复制、粘贴支持。如何在一个组件中将两者结合起来呢?
你可以在TransferHandler
的importData
方法中同时实现两者,像这样:
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的地方。