我们最近升级了我们的应用程序,使其在Java 11 (以前是Java 8)下运行。在我们的应用程序主屏幕上有一个面板,可以将文件拖放到上面。这在Windows上运行良好,但在OSX上就不行了。(曾在Java 8下工作,切换到Java 11后失败)。
文件可以从支持该文件的其他Java应用程序中拖动,但不能从Finder中拖动。永远不会调用TransferHandler.canImport()方法。
调用了DropTarget.dragOver()方法,但从未调用过drop()方法。我不能跟踪运行时库方法,因为它没有行号信息。
我发现我可以将文件从Finder拖到另一个Java应用程序,或者拖到我们主应用程序的JDialog上。只有当JTable在我们的主应用程序窗口的面板中时,它才会失败。因此,我们的应用程序一定是做了一些奇怪的事情,导致它失败。
问题是找出它失败的原因,只在OSX上。这是一个很大的应用程序,并且主窗口相当复杂。发布一个自包含的源代码示例是不可能的--特别是因为这个简单的例子是可行的。
我真正需要的是一个包含行号信息的Java11Runtime库,这样我就可以深入了解它了。是的,我有完整的Java 11JDK源码。(采用OpenJDK)我一直无法让它在Eclipse下编译。
关于我们的应用程序可以做些什么来导致这个失败,有什么建议吗?或者在哪里可以找到Debug Java 11运行时库?
发布于 2020-04-14 07:13:26
当然,如果有一个Debug运行时库就好了。
问题是,在调用DropTarget.dragEnter()和.dragOver()时,Transferable和getCurrentDataFlavors()中的数据在OSX上是无效的。getCurrentDataFlavors()将返回所有数据风格的列表-所有数据风格都不会有任何transferData。(这意味着在所有对TransferHandler.canImport()的调用中,数据也是无效的。)
数据唯一有效的时候是在TransferHandler.importData()调用中。
我们的代码检查用户是否在canImport()调用中拖动了正确类型的文件。因为所有数据现在都是无效的(OSX,Java11),所以调用抛出了一个NPE (因为getCurrentDataFlavors()包含了我们想要的风格,但是getTransferData(风格)返回null。请注意,这在Java 8中可以正常工作。
将其与默默忽略异常的运行时拖动处理代码结合在一起,好吧,并不是完全忽略它们,当发生一次操作时,它会禁用该目标上的所有进一步拖放操作。这使得追踪正在发生的事情变得非常困难。
https://stackoverflow.com/questions/61129668
复制相似问题