2016-07-03 2 views
2

Java 9 limitera tout accès à une API privée. Cela signifie que les méthodes connues de récupération de la fenêtre hwnd à l'aide de Reflection ne fonctionneront plus.Est-il possible d'obtenir un HWND d'une fenêtre JavaFX dans Java 9?

Y a-t-il encore un moyen de les obtenir? Je demande parce que j'ai une bibliothèque qui offre une API pour manipuler la barre des tâches (d'une manière similaire aux offres Java9). L'API Java 9 est toujours pour AWT, donc j'espère pouvoir obtenir ma configuration de projet pour Java 9 et JavaFX.

J'avais l'habitude d'appeler simplement les méthodes privées, mais cela va cesser de fonctionner. Toute solution est appréciée. Les appels natifs sont ok s'ils peuvent être faits en utilisant JNA ou BridJ.

+0

Pouvez-vous regarder juste le code source des méthodes que vous utilisez déjà, puis les copier dans un autre paquet, expédition Java résultant et code natif avec votre application? – jewelsea

+0

Je ne comprends pas vraiment pourquoi un changement de paquet va m'aider là-bas. Java 9 n'autorise pas l'utilisation et renvoie ReflectionExceptions un peu partout si vous tentez d'accéder à des API qui ne sont pas exportées via le fichier d'informations du module. – SirWindfield

+0

Si vous copiez du code et mettez votre propre paquetage et y écrivez votre propre fichier d'informations de module qui exporte les fonctions dont vous avez besoin de votre propre paquet, vous ne devriez pas recevoir les exceptions RelectionExceptions auxquelles vous vous référez. Cela dit, je me rends compte que cela pourrait avoir des complications subtiles qui rendent une telle approche inutile et irréalisable, et c'est pourquoi je viens de suggérer une approche que vous pourriez envisager. – jewelsea

Répondre

1

Une façon pourrait être d'apporter des modifications à un déjà suggéré solution-How can I get the window handle (hWnd) for a Stage in JavaFX? utile avant JDK9 que: -

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; 
} 

avec un module-info.java un peu comme:

module your.module { 
    requires javafx.graphics; 
} 

Mais depuis javax.graphics exporte la emballer en interne à des modules spécifiques comme:

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

Vous pouvez essayer d'ajouter une option de compilateur pour faire encore usage comme

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

Note/Imp: Responsabilité de JEP-261:Module System -

Les --add-exports et --add-opens options doivent être utilisé avec de bons soins . Vous pouvez les utiliser pour accéder à une API interne d'un module de bibliothèque, ou même du JDK lui-même, mais vous le faites à vos risques et périls: échouer.