当程序为 运行 时,JavaFX 8 屏幕分辨率不会更新
JavaFX 8 Screen resolution doesn't update when program is running
出于某种原因,当我使用 Screen.getPrimary().getVisualBounds().getWidth());
打印笔记本电脑的分辨率宽度时,我得到了 1920 的正确结果。但是如果我打印分辨率宽度,请在 Windows 设置中将分辨率更改为 1680x1050,让线程稍等片刻,然后使用相同的代码再次打印分辨率宽度,我得到的是 1920 而不是 1680!但是,如果我停止项目,将分辨率设置为 1680x1050,然后编译并 运行 项目,它会打印 1680。换句话说,如果我在项目是 运行ning。
下面是一些 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); }
}
问题与在同一线程上轮询屏幕分辨率有关。如果创建了一个新线程,当用户在 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); }
}
出于某种原因,当我使用 Screen.getPrimary().getVisualBounds().getWidth());
打印笔记本电脑的分辨率宽度时,我得到了 1920 的正确结果。但是如果我打印分辨率宽度,请在 Windows 设置中将分辨率更改为 1680x1050,让线程稍等片刻,然后使用相同的代码再次打印分辨率宽度,我得到的是 1920 而不是 1680!但是,如果我停止项目,将分辨率设置为 1680x1050,然后编译并 运行 项目,它会打印 1680。换句话说,如果我在项目是 运行ning。
下面是一些 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); }
}
问题与在同一线程上轮询屏幕分辨率有关。如果创建了一个新线程,当用户在 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); }
}