JavaFX 11在Fedora 33 Xorg环境下Dialog与Alert无尺寸显示异常
问题根因
这是OpenJFX 11与Fedora 33环境下KDE KWin窗口管理器、Xorg 1.20服务的已知兼容问题,核心是JFX内置的Dialog/Alert组件默认启用的平台原生窗口装饰渲染逻辑,和KWin的窗口尺寸计算、层级对齐逻辑存在冲突,导致窗口布局计算异常。你之前用FXMLLoader实例化的自定义弹窗本质是普通Stage,没有走Dialog专属的原生装饰逻辑,因此没有触发问题。
可行解决方案
- 方案1:添加JVM启动参数禁用Dialog原生装饰
启动应用时添加如下参数即可,无需修改业务代码:-Djavafx.allow.dialog.native.decoration=false -Djdk.gtk.version=2 - 方案2:代码层面强制触发Dialog布局计算
在现有Dialog代码中补充pref尺寸设置、主动调用布局方法,修复尺寸误判问题:fun YNdialog (txt : String) : Boolean { val dlog = Dialog<ButtonType>() dlog.dialogPane.apply { contentText = txt buttonTypes.addAll(ButtonType.OK, ButtonType.CANCEL) minWidth = 200.0 minHeight = 100.0 // 新增pref尺寸设置 prefWidth = 200.0 prefHeight = 100.0 // 主动触发布局计算 layout() } dlog.initOwner(theStage.scene.window) val r = dlog.showAndWait() return r.isPresent && r.get() == ButtonType.OK } - 方案3:升级OpenJFX版本
OpenJFX 17及以上LTS版本已修复该类KDE/Xorg环境下的Dialog渲染缺陷,直接升级依赖即可解决绝大多数兼容问题,无需额外修改代码。 - 方案4:用Stage自定义弹窗
如果上述方案都不满足需求,可以直接用普通Stage模拟Dialog功能,和你之前正常运行的自定义弹窗逻辑一致,不会触发兼容问题:设置initModality(Modality.WINDOW_MODAL)绑定父窗口模态,手动添加按钮和回调逻辑即可。
内容的提问来源于stack exchange,提问作者wholerabbit
相关产品推荐
相关产品推荐

