当前位置: 首页 > 知识库问答 >
问题:

将文件附件从Outlook拖放到Java应用程序中——在Swing中有效,但在JavaFX中无效?

唐和洽
2023-03-14

上下文:Windows 7 64位,Java8,Microsoft Outlook 2010。

首先,是的,关于这个主题还有其他一些问题(例如,这里和这里)。这个问题有更多的背景,以及我试图做的事情实际上在Swing中起作用的事实 - 所以也许这是JavaX拖放功能与Swing相比的限制。

在一些基于Java Swing的应用程序中,从Outlook电子邮件中拖动文件附件可以正常工作。例如,如果我有一封带有纯文本文件附件(或XML)的电子邮件,并将该附件直接拖到IntelliJ IDEA(2019.1版)中,则会打开一个包含附件内容的新选项卡。

请注意,我不是将附件拖到桌面上,然后拖到应用程序中,而是直接从Outlook拖到IntelliJ。

这也适用于NetBeans和DbVisualizer(都是基于Swing的应用程序)。

我对Outlook的理解是,文件附件的拖放要求接收应用程序能够直接从Outlook流式传输二进制数据。这里有一些示例C/C代码,这里有一个. NET示例。相当多的本机Windows应用程序甚至懒得处理这个问题——例如,您不能将文件附件从Outlook直接拖到记事本中。

到目前为止,我还无法在JavaFX中实现这一点。我得到了drop事件和枚举的2种数据格式(一种私有的称为“RenPrivateItem”,另一种称为“message/external-body”)。但尝试获取这些格式中的任何一种都只会返回null。

这里有一个针对OpenJDK的错误。

是的,我知道有一个解决方法-我可以使用Outlook加载项(如OutlookFileDrag)使Outlook在拖放时将附件复制到本地临时文件夹。然后,我的应用程序接收的拖放操作只是本地文件名的列表,一切都很简单。

但如果可能的话,我希望避免使用Outlook加载项。

所以我的问题实际上有几个子问题:-

>

  • 看起来Swing/AWT可以在拖动文件附件时管理Outlook中的数据搬迁(IDataObject接口?)。JavaFX没有实现相同的功能吗?

    有什么方法可以在JavaFX应用程序中使用AWT拖放功能吗?还是那只是自找麻烦?

    如果JavaFX实际上实现了必要的Windows代码来复制文件附件数据(我希望它实现了,因为我至少可以看到数据格式),那么有没有办法从dragboard对象中获取原始字节呢?

    顺便说一句,我一直在尝试深入研究JDK和IntelliJ的源代码,以实际了解如何在Swing中实现这一点,但是我有点迷失在所有细节中。如果有人能指出实际实现这种行为的类/文件,我将不胜感激,谢谢。

  • 共有1个答案

    归俊杰
    2023-03-14

    正如上面注释中的帖子(由于堆栈溢出的限制,无法进行注释),我基于Java/SWT做了一些工作。这个解决方案对JavaFX不起作用,目前我也将为JavaFX完成它。当我们坐在同一条船上时:您是如何在Outlook附件上获得JavaFX应答的?我只对掉下来的邮件有效。

    最后,我对SWT的解决方案是接受丢弃邮件(而不是附件)的挑战。因此,我必须访问从outlook接收的原始指针,并根据OLE内容(复合对象,复合流等)重建整个Outlook消息。我使用Apache POI将其写入一个新文件,该文件与丢弃的不兼容的1:1二进制文件。MSG 文件,但包含所有需要的信息。

    如上所述,在 SWT 中处理附件与在 Swing 中一样简单。对不起,这个答案并不能进一步帮助你,但是由于我也在努力,我希望也能找到一个解决方案。

     类似资料:
    • 我正在尝试将自定义对象从JPanel拖放到JavaFX场景<为了实现这一点,我创建了一个带有自定义对象和自定义TransferHandler的简单应用程序。在本例中,我的问题是,当我在

    • 问题内容: 有人可以告诉我我在做什么错吗?我可以使用常规面板进行拖放操作,但现在尝试使用表格,无法对其进行整理。我对Points和DropTargets感到困惑。不要介意“添加”按钮。我觉得我需要首先处理DnD。 问题答案: 我个人会放弃滚动窗格上的放置目标,这将导致您遇到许多问题。 您的放置方法有点怪异… 这是一个坏主意.... 基本上,您尝试从可转移文件中提取文件列表,并且不管操作成功与否,您

    • 问题内容: 如今,我们可以将文件拖放到一个特殊的容器中,并使用XHR2上载它们。带有实时进度条等。非常酷的东西。 但是有时候我们不想要那么酷。我想要的是一次将文件拖放 到标准HTML文件输入中 :。 那可能吗?有什么方法可以从文件拖放中用正确的文件名(?)“填充”文件输入吗?(出于文件系统安全性原因,完整的文件路径不可用。) 为什么? 因为我想提交一份普通表格。适用于所有浏览器和所有设备。拖放只是

    • 问题内容: 我一直在编码OCR书籍扫描程序(它通过读取页码来重命名页面),并且已经从基本的CLI Python脚本切换到GUI。 我正在使用PyQT4并拖放查看大量文档,但是没有运气。它只是拒绝接收那些文件!我将这些用于我的UI设计文章: http://tech.xster.net/tips/pyqt-drag-images-into-list-widget-for-thumbnail-list/

    • 我有一个很大的swing应用程序,我想把javafx嵌入其中。我多次尝试这样做(通过遵循oracle教程等),但只有在声明一个新的JFrame以使用JFXPanel组件时才成功。但是,我不想使用新的框架,我想将我的Javafx代码合并到swing应用程序的根JFrame中。 我们可以将javaFX组件嵌入到JPanel而不是JFrame中吗?如果答案是肯定的,为什么我没有成功?

    • 我在互联网上搜索了如何将JButtons拖放到对象的示例,但我无法使其工作。 我的程序所做的是,当我单击一个按钮时,对象更新了一个字段(使用selectedobject.setField())。我希望能够通过拖动JButton而不是单击来做到这一点。 我该怎么做?我找到了这个,并试图输入我的代码: 我从这里参加了ImageHandler课程。