这些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的地方。