You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向Swing应用添加JFXPanel导致Swing组件缩小的问题求助

解决Swing嵌入JFXPanel后组件缩放异常的问题

问题根源

你遇到的情况本质是JavaFX和Swing对高DPI屏幕的缩放逻辑不兼容:Swing识别的是系统缩放后的屏幕尺寸(1536×864,对应3840×2160分辨率下150%的缩放比例),但JavaFX默认直接读取原始物理分辨率,创建Scene后会干扰系统的缩放上下文,导致Swing组件被错误地按原始高分辨率缩放,变得极小。

修复方案

1. 强制JavaFX适配系统DPI缩放

在初始化JFXPanel之前(比如主类的main方法开头)添加以下系统属性,让JavaFX遵循系统的缩放设置:

System.setProperty("prism.allowhidpi", "true");
System.setProperty("glass.win.uiScale", "system");

这会让JavaFX使用和Swing一致的缩放比例,避免分辨率识别冲突。

2. 确保Swing启用高DPI支持

同时给Swing也配置高DPI适配,在Swing组件初始化前添加:

System.setProperty("sun.java2d.uiScale", "system");

如果不想硬编码,也可以在JRE的jre/lib/jfx.properties或系统环境变量中配置这些属性。

3. 手动同步缩放比例(备用方案)

如果系统属性配置无效,手动计算Swing的缩放比例,然后应用到JavaFX的Scene尺寸上:

// 在Swing主类中获取缩放比例(96是标准DPI值)
double scaleFactor = Toolkit.getDefaultToolkit().getScreenResolution() / 96.0;

// 在SceneGenerator中创建Scene时,用Swing识别的尺寸创建
Dimension swingScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
Scene scene = new Scene(root, swingScreenSize.getWidth(), swingScreenSize.getHeight());
// 或者如果JavaFX仍用原始尺寸,就按缩放比例缩小Scene
// Scene scene = new Scene(root, 3840/scaleFactor, 2160/scaleFactor);

这样能保证JavaFX和Swing使用同一套尺寸基准,不会干扰系统的缩放判断。

4. 调整初始化顺序

确保先初始化Swing的所有UI组件,再创建JFXPanel和JavaFX的Scene,避免JavaFX的上下文先加载覆盖Swing的缩放设置。

验证方式

修改后分别在Swing主类和SceneGenerator中打印屏幕尺寸:

  • Swing端:System.out.println(Toolkit.getDefaultToolkit().getScreenSize());
  • JavaFX端:System.out.println(Screen.getPrimary().getBounds());
    确认两者的缩放后尺寸一致,再打开JDialog检查组件显示是否恢复正常。

内容的提问来源于stack exchange,提问作者TinaBo13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:36:14