2

Java 9 将限制对私有 API 的任何访问。这意味着使用反射检索窗口 hwnd 的已知方法将不再起作用。

还有办法得到它们吗?我问是因为我有一个库,它提供了一个用于操作任务栏的 API(以类似于Java9提供的方式)。Java 9 API 仍然适用于 AWT,所以我希望我可以为 Java 9 和 JavaFX 设置我的项目。

我以前只调用私有方法,但这将停止工作。任何解决方案表示赞赏。如果可以使用 JNA 或 BridJ 完成本机调用,则可以。

4

1 回答 1

0

一种方法可能是更改已经建议的解决方案 如何在 JavaFX 中获取舞台的窗口句柄 (hWnd)?在 JDK9 之前有用:-

try {
    TKStage tkStage = stage.impl_getPeer();
    Method getPlatformWindow = tkStage.getClass().getDeclaredMethod("getPlatformWindow" );
    getPlatformWindow.setAccessible(true);
    Object platformWindow = getPlatformWindow.invoke(tkStage);
    Method getNativeHandle = platformWindow.getClass().getMethod( "getNativeHandle" );
    getNativeHandle.setAccessible(true);
    Object nativeHandle = getNativeHandle.invoke(platformWindow);
    return new Pointer((Long) nativeHandle);
} catch (Throwable e) {
    System.err.println("Error getting Window Pointer");
    return null;
}

有点module-info.java像:

module your.module {
    requires javafx.graphics;
}

但是由于javax.graphics在内部将包导出到特定模块,如下所示:

exports com.sun.javafx.tk to
    javafx.controls,
    javafx.deploy,
    javafx.media,
    javafx.swing,
    javafx.web;

您可以尝试添加编译器选项以仍将其用作

--add-exports javax.graphics/com.sun.javafx.tk=your.module

Note/Imp :免责声明JEP-261:Module System -

和选项必须非常小心地使用--add-exports--add-opens您可以使用它们来访问库模块甚至 JDK 本身的内部 API,但这样做的风险由您自己承担:如果该内部 API 被更改或删除,那么您的库或应用程序将失败。

于 2017-10-07T08:10:59.467 回答