2016-07-03 7 views
2

Java 9 ограничит доступ к частному API. Это означает, что известные методы получения окна hwnd с использованием Reflection больше не будут работать.Как можно получить HWND окна JavaFX в Java 9?

Есть ли еще способ получить их? Я спрашиваю, потому что у меня есть библиотека, которая предлагает API для управления панелью задач (аналогично тому, как это предлагает Java9). API Java 9 по-прежнему предназначен для AWT, поэтому я надеюсь, что смогу получить настройки моего проекта для Java 9 и JavaFX.

Я использовал только частные методы, но это перестанет работать. Любое решение оценивается. Родные звонки в порядке, если их можно сделать с помощью JNA или BridJ.

+0

Вы можете просто посмотреть на исходный код методов, которые вы уже используете, а затем скопировать их в другой пакет, доставка результирующую Java и Native код с приложением? – jewelsea

+0

Я не совсем понимаю, почему изменение пакета поможет мне там. Java 9 не позволяет использовать и выделяет ReflectionExceptions повсюду, если вы пытаетесь получить доступ к API, которые не экспортируются через файл информации модуля. – SirWindfield

+0

Если вы скопируете код и поместите в свой собственный пакет и напишите свой собственный информационный файл модуля для него, который экспортирует нужные вам функции из вашего собственного пакета, то вы не должны получать RelectionExceptions, на которые вы ссылаетесь. Тем не менее, я понимаю, что это может привести к некоторым тонким осложнениям, которые делают такой подход нецелесообразным или выполнимым, поэтому я просто предложил в качестве подхода, который вы, возможно, пожелаете рассмотреть. – jewelsea

ответ

1

Одним из способов может быть, чтобы внести изменения в уже предложил solution к How can I get the window handle (hWnd) for a Stage in JavaFX? полезным до 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 

Примечание/Imp: Отказ от JEP-261:Module System -

В --add-exports и --add-opens варианты должны использовать с большим уход. Вы можете использовать их для получения доступа к внутреннему API библиотеки или даже самому JDK, но вы делаете это на свой страх и риск: Если этот внутренний API был изменен или удален, то ваша библиотека или приложение будут потерпеть неудачу.