2017-04-07 4 views
0

Screen.getPrimary().getVisualBounds().getWidth());을 사용하여 노트북의 해상도 너비를 인쇄 할 때 나는 1920 년 결과를 얻었습니다. 그러나 해상도 너비를 인쇄 할 경우 Windows에서 해상도를 1680x1050으로 변경하십시오 설정, 스레드가 잠시 기다려달라고 요청하고 동일한 코드를 사용하여 해상도 너비를 다시 인쇄하면 1680 대신 1920이됩니다! 그러나 프로젝트를 중지하고 해상도를 1680x1050으로 설정 한 다음 프로젝트를 컴파일하고 실행하면 1680이 인쇄됩니다. 즉, 프로젝트가 실행되는 동안 프로젝트를 변경하면 해상도가 업데이트되지 않는 것으로 보입니다.JavaFX 8 프로그램 실행 중 화면 해상도가 업데이트되지 않음

아래는 내가 의미하는 바를 설명하기위한 몇 가지 JavaFX 코드입니다. 아래 코드를 실행하면 1920 인쇄본을보고 해상도를 빠르게 변경하고 스레드가 수면을 마칠 때까지 기다린 다음 설명 된대로 새 해상도 너비 대신 1920을 계속 인쇄합니다.

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     System.out.println(Screen.getPrimary().getVisualBounds().getWidth()); 
     Thread.sleep(60000); 
     System.out.println(Screen.getPrimary().getVisualBounds().getWidth()); 
    } 
    public static void main(String[] args) { launch(args); } 
} 
+0

JavaFX의 최신 버전에서 사용 해본 적이 있습니까? –

+0

JavaFX 8을 사용하고있는 것으로 밝혀졌습니다 (IntelliJ는 JavaFX 2.0으로 언급합니다). 댓글 주셔서 감사합니다. 그에 따라 내 질문이 업데이트되었습니다. – Max

답변

0

문제는 동일한 스레드에서 화면 해상도를 폴링하는 것과 관련이 있습니다. 새 스레드가 생성되고 사용자가 Windows 설정에서 화면 해상도를 변경 한 다음 화면 해상도 화면을 인쇄하라는 메시지가 나타나면 잠자기를 요청하면 해상도에 업데이트 된 해상도가 반영됩니다.

스레드가 잠든 동안 사용자가 다음을 실행하여 해상도를 변경하면 원래 질문의 코드와 달리 올바른 업데이트 된 해상도가 화면에 인쇄됩니다.

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     System.out.println(Screen.getPrimary().getVisualBounds().getWidth()); 
     new Thread(){ 
      public void run() { 
       try{ 
        this.sleep(30000); 
       } catch (InterruptedException e) { 
        // ignore 
       } 

System.out.println(Screen.getPrimary().getVisualBounds().getWidth()); 
      } 
     }.start(); 
    } 
    public static void main(String[] args) { launch(args); } 
} 

업데이트 된 화면 해상도를 반영하는 또 다른 솔루션은 AWT를 사용하는 것입니다. 다음은 올바른 업데이트 된 해상도를 인쇄합니다.

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 

System.out.println(java.awt.Toolkit.getDefaultToolkit().getScreenSize()); 
     Thread.sleep(30000); 

System.out.println(java.awt.Toolkit.getDefaultToolkit().getScreenSize()); 
    } 
    public static void main(String[] args) { launch(args); } 
}