2017-04-07 63 views
0

由於某些原因,當我使用Screen.getPrimary().getVisualBounds().getWidth());打印我的筆記本電腦的分辨率寬度時,我得到了1920的正確結果。但是,如果我打印分辨率寬度,請在Windows中將分辨率更改爲1680x1050設置,讓線程等待一分鐘,並使用相同的代碼再次打印分辨率寬度,我得到1920而不是1680!但是,如果我停止了該項目,請將分辨率設置爲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); } 
}