2016-07-03 13 views
2

Java 9はプライベートAPIへのアクセスを制限します。つまり、リフレクションを使用してウィンドウhwndを取得する既知の方法はもう機能しません。Java 9でJavaFXウィンドウのHWNDを取得できますか?

まだ入手方法はありますか?私はタスクバーを操作するためのAPIを提供するライブラリを持っているので(私はJava9が提供する同様の方法で)質問します。 Java 9 APIはまだAWT用ですので、Java 9とJavaFX用にプロジェクトをセットアップすることができれば幸いです。

プライベートメソッドを呼び出すだけでしたが、これは機能しなくなります。 解決方法はありますか?ネイティブ・コールは、JNAまたはBridJを使用して実行できる場合は正常です。 javax.graphicsをエクスポートするので

module your.module { 
    requires javafx.graphics; 
} 

しかし:module-info.javaやや等と

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

- :

+0

は、あなたはちょうどあなたがすでに使用して、別のパッケージにコピーし、アプリケーションに結果Javaとネイティブコードを出荷しているメソッドのソースコードを見てすることはできますか? – jewelsea

+0

パッケージ変更がなぜ私を助けてくれるのか、私は本当に分かりません。 Java 9では、モジュール情報ファイルからエクスポートされていないAPIにアクセスしようとすると、その使用が許可されず、ReflectionExceptionsが全面的にスローされます。 – SirWindfield

+0

コードをコピーして自分のパッケージに入れ、自分のパッケージから必要な機能をエクスポートするモジュール情報ファイルを作成すると、あなたが参照しているRelectionExceptionsを受け取るべきではありません。つまり、そうすることは、そうしたアプローチを価値のないものにする微妙な合併症を起こす可能性があることを実感しています。 – jewelsea

答えて

1

一つの方法は、すでにとして前JDK9に便利How can I get the window handle (hWnd) for a Stage in JavaFX?solutionを示唆したに変更を加えることかもしれません特定のモジュールに内部的にパッケージする:

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 

注意として、それを利用するためにコンパイラオプションを追加してみてくださいすることができます/インプ:JEP-261:Module Systemから免責事項 -

--add-exports--add-opensオプションなければなりません大切にして使用してください 注意してください。それらを使用してライブラリ モジュールの内部API、またはJDK自体のアクセス権を得ることができますが、自己責任で行ってください: 内部APIが変更または削除された場合、ライブラリまたは アプリケーションは失敗します。

関連する問題