JavaFX 8屏幕分辨率在程序运行时不会更新

时间:2017-04-07 21:18:16

标签: java javafx java-8 javafx-8 screen-resolution

出于某种原因,当我使用Screen.getPrimary().getVisualBounds().getWidth());打印笔记本电脑的分辨率宽度时,我得到1920的正确结果。但是如果我打印分辨率宽度,在Windows设置中将分辨率更改为1680x1050,请询问线程等待一分钟,并使用相同的代码再次打印分辨率宽度,我得到1920而不是1680!但是,如果我停止项目,将分辨率设置为1680x1050,然后编译并运行项目,它会打印1680.换句话说,如果我在项目时更改了分辨率,项目似乎没有更新分辨率运行。

下面是一些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); }
}

1 个答案:

答案 0 :(得分: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); }
}