【问题标题】:JavaFX 8 Screen resolution doesn't update when program is running程序运行时JavaFX 8屏幕分辨率不更新
【发布时间】:2017-04-07 21:18:15
【问题描述】:

由于某种原因,当我使用 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); }
}

【问题讨论】:

  • 你在最新版本的 JavaFX 上试过这个吗?
  • 原来我使用的是 JavaFX 8(出于某种原因,IntelliJ 将其称为 JavaFX 2.0)。感谢您的评论。我相应地更新了我的问题。

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


【解决方案1】:

问题与在同一线程上轮询屏幕分辨率有关。如果创建了一个新线程,在用户更改 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); }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 2011-08-13
    • 2020-06-09
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多