JavaFX高DPI屏幕缩放显示异常及适配方案咨询
问题根源
JavaFX 8及更高版本默认开启系统DPI缩放适配特性,会跟随系统的缩放比例自动放大所有界面元素。如果你的布局里写死了固定像素尺寸,放大后就会出现内容超出屏幕边界的问题。
解决方案
方案1:强制关闭DPI自动缩放(快速修复当前问题)
直接通过系统属性配置,让JavaFX始终以100%比例渲染界面,不跟随系统缩放调整。在main方法的launch调用前添加以下配置即可:
public static void main(String[] args) { // Windows系统禁用缩放 System.setProperty("glass.win.uiScale", "100%"); // Linux系统禁用缩放 System.setProperty("glass.gtk.uiScale", "100%"); // macOS系统禁用缩放 System.setProperty("glass.macos.uiScale", "100%"); launch(args); }
也可以在IDEA的运行配置VM选项中添加参数-Dglass.win.uiScale=100%,效果和代码配置一致。同时你原代码里的stage.sizeToScene()调用可以删除,设置最大化后该调用不会生效。
修改后的完整运行代码:
@Override public void start(Stage stage) throws IOException{ Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("hello-view.fxml"))); Scene scene = new Scene(root); Screen screen = Screen.getPrimary(); double dpi = screen.getDpi(); double scaleX = screen.getOutputScaleX(); double scaleY = screen.getOutputScaleY(); System.out.println("DPI: " + dpi + " - scaleX: " + scaleX + " - scaleY: " + scaleY); stage.setTitle("JavaFX_Practice"); stage.setScene(scene); stage.setMaximized(true); stage.show(); } public static void main(String[] args) { System.setProperty("glass.win.uiScale", "100%"); System.setProperty("glass.gtk.uiScale", "100%"); System.setProperty("glass.macos.uiScale", "100%"); launch(args); }
方案2:调整布局适配不同缩放比例(推荐长期使用)
如果希望界面在不同DPI、不同缩放比例下都能正常显示,不会出现元素过小/过大的问题,需要调整布局规则:
- 不要在FXML中给组件设置固定宽高像素值,尽量使用默认的自动计算尺寸,或者绑定父容器的宽高属性
- 使用AnchorPane时给子组件设置四个方向的锚点,比如需要占满整个AnchorPane的组件,可将上下左右四个锚点值都设为0,子组件会自动跟随父容器缩放调整尺寸
- VBox内需要拉伸的子元素可以设置
vgrow属性为ALWAYS,让元素随容器高度自动拉伸
效果参考
100%缩放比例下窗口效果:
125%缩放比例下窗口效果:
内容的提问来源于stack exchange,提问作者Lenghak Hok
相关产品推荐
相关产品推荐

