2017-04-07 60 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); } 
}