2016-07-03 4 views
2

Java 9는 비공개 API에 대한 액세스를 제한합니다. 이는 Reflection을 사용하여 창 hwnd를 검색하는 알려진 방법이 더 이상 작동하지 않는다는 것을 의미합니다.Java 9에서 JavaFX 창의 HWND를 얻는 것이 어떻게 가능합니까?

아직 방법을 얻을 수 있습니까? 작업 표시 줄 조작을위한 API (Java9과 비슷한 방식으로)를 제공하는 라이브러리가 있기 때문에 요청합니다. Java 9 API는 여전히 AWT 용이므로 Java 9 및 JavaFX에 대한 프로젝트 설정을 얻을 수 있기를 바랍니다.

개인용 메서드를 호출하는 데 사용되었지만 작동이 중지됩니다. 모든 해결책을 주시면 감사하겠습니다. 네이티브 호출은 JNA 또는 BridJ를 사용하여 수행 할 수 있으면 정상입니다. 다소 같은 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; 
} 

: javax.graphics 이후

module your.module { 
    requires javafx.graphics; 
} 

그러나이 수출 -이 :로

+0

이미 사용하고있는 메소드의 소스 코드를보고 다른 패키지로 복사하여 응용 프로그램과 함께 결과 Java 및 원시 코드를 전송할 수 있습니까? – jewelsea

+0

패키지 교체가 왜 도움이되는지 이해가 안됩니다. Java 9는 사용을 허용하지 않고 모듈 정보 파일을 통해 내 보내지 않은 API에 액세스하려고하면 ReflectionExceptions를 던져 버립니다. – SirWindfield

+0

코드를 복사하여 자신의 패키지에 넣고 자신의 패키지에서 필요한 기능을 내보내는 모듈 정보 파일을 작성하면 참조하는 RelectionExceptions를 수신해서는 안됩니다. 즉, 그렇게하는 것이 가치 있고 실현 가능하지 않은 접근 방식을 만드는 미묘한 합병증을 가질 수 있다는 것을 알고 있습니다. 그래서 나는 당신이 고려하고 싶은 접근 방식으로 제안한 것입니다. – jewelsea

답변

1

한 가지 방법은 이미 solutionHow can I get the window handle (hWnd) for a Stage in JavaFX?에게 유용 이전 JDK9에 제안한 변경을 할 수 특정 모듈에 내부적으로 패키지 :

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 선택해야합니다 신경 쓰이는 와 함께 사용하십시오. 라이브러리 모듈 또는 심지어 JDK 자체의 내부 API에 액세스 할 수는 있지만 사용자의 책임하에 수행하십시오. 내부 API가 변경되거나 제거 된 경우 라이브러리 또는 응용 프로그램이 실패.