文档

Java™教程
隐藏目录
顶级拖放
路径:使用Swing创建GUI
课程:拖放和数据传输

顶级拖放

到目前为止,我们主要关注于将TransferHandler附加到JComponent子类之一上。但是,您也可以直接在顶层容器(如JFrameJDialog)上设置TransferHandler

这对于导入文件的应用程序特别有用,例如编辑器、集成开发环境、图像处理程序、CD刻录程序。这样的应用程序通常包括一个菜单、一个工具栏、一个用于编辑文档的区域,以及一个用于在打开的文档之间切换的列表或机制。

我们有一个这样的示例,但因为此演示程序读取文件,所以我们没有提供Java Web Start版本 - 您将需要自己下载和编译该演示程序。

如下面的屏幕截图所示,TopLevelTransferHandlerDemo有一个菜单(除了演示子菜单外为空),一个(非功能性的)工具栏,一个(左侧的)区域显示打开文档的列表,以及一个(右侧的)区域显示每个打开文档的内容。在启动时,蓝色文档区域已分配了一个支持文件导入的传输处理程序 - 因此是唯一可以接受拖放的地方。

TopLevelTransferHandlerDemo演示程序的快照。

试一试: 
  1. 编译并运行TopLevelTransferHandlerDemo示例,如果您想下载一个适用于NetBeans的zip文件结构,请参考示例索引
  2. 从本地桌面或文件系统拖动一个文件并将其放置在右侧的蓝色文档区域。文件将被打开,并且填充有其内容的框架将出现。文档区域(JDesktopPane)包含支持导入javaFileListFlavor的传输处理程序。
  3. 拖动另一个文件并尝试将其放置在文档区域。您会发现您无法将其放置在显示最后一个文件的框架上。您还不能将其放置在列表、菜单或工具栏上。您只能将其放置在文档区域的蓝色部分或先前打开的框架的菜单栏上。在每个内容框架中,都有一个文本组件的传输处理程序,它不知道如何处理文件拖放,您可以将文本拖放到该区域,但不能拖放文件。
  4. 从菜单中选择Demo->Use Top-Level TransferHandler,将传输处理程序安装到顶级容器(JFrame)上。
  5. 再次尝试拖动示例。接受拖放的区域数量已增加。现在您可以在应用程序的几乎任何地方进行拖放,包括菜单栏、工具栏、框架的标题栏,但不能在列表(左侧)或先前打开的文件的内容区域上进行拖放。既JList的传输处理程序也不知道如何导入文件。
  6. 从菜单中选择Demo->Remove TransferHandler from List and Text,禁用剩下的组件上的传输处理程序。
  7. 再次拖动示例。您现在可以在应用程序的任何地方拖放文件!
  8. 从菜单中选择Demo->Use COPY Action。
  9. 再次拖动示例。请注意,鼠标指针现在显示COPY指针 - 这提供了更准确的反馈,因为成功拖放不会从源中删除文件。目标可以根据需要选择可用的拖放操作,如选择拖放操作中所述。

注意:禁用文本组件上的默认传输处理程序会产生一个不希望的副作用:您不能再在编辑区域内拖放(或剪切/复制/粘贴)文本。要解决这个问题,您需要为文本组件实现一个自定义传输处理程序,该处理程序接受文件拖放,并重新实现了缺失的文本传输支持。您可能希望关注RFE 4830695,该请求允许在现有的TransferHandler之上添加数据导入功能。

这是TopLevelTransferHandlerDemo.java的源代码:


    

上一页: 拖放位置渲染
下一页: 添加剪切、复制和粘贴(CCP)