Linux下JavaFX窗口打开/关闭对话框时抖动问题求助
Ubuntu 22.04下JavaFX对话框触发主窗口抖动及最大化按钮异常问题
问题现象
在Ubuntu 22.04原生系统上运行JavaFX应用时,打开或关闭任意类型Dialog(如Alert)时,主窗口会出现抖动;同时观察到对话框显示期间,主窗口的最大化按钮消失,关闭对话框后按钮恢复。该问题仅在Linux系统的JavaFX应用中出现,Windows系统下运行正常,本机Swing应用无此异常。
测试环境
- Java版本:21.0.3+9
- JavaFX版本:19.0.2.1
- 操作系统:Ubuntu 22.04(原生未定制,未修改系统窗口管理器配置)
极简测试代码
public class Test extends Application { @Override public void start( Stage stage ) { Button button = new Button( "Test" ); button.setOnAction( e -> { Alert alert = new Alert(Alert.AlertType.NONE, "Hello", ButtonType.CLOSE ); alert.initOwner( stage.getScene().getWindow() ); alert.showAndWait(); } ); VBox vbox = new VBox(); vbox.getChildren().add( button ); stage.setScene( new Scene( vbox, 600, 800 ) ); stage.show(); } }
排查与解决建议
- 版本兼容性调整:Java 21建议搭配同版本的JavaFX(21.x)使用,版本不匹配可能引发窗口管理兼容性问题,尝试升级JavaFX到最新稳定版。
- 指定GTK后端版本:添加VM启动参数
-Djdk.gtk.version=3,强制JavaFX使用GTK3窗口后端,部分旧版本JavaFX在GTK2下可能存在窗口交互异常。 - 禁用系统窗口动画:临时关闭GNOME的窗口动画验证是否为动画冲突,执行命令:
gsettings set org.gnome.desktop.interface enable-animations false,若问题消失,可调整系统动画设置或等待JavaFX后续版本修复。 - 调整对话框模态设置:尝试移除
alert.initOwner(stage.getScene().getWindow())或设置alert.initModality(Modality.NONE),排查是否为窗口owner关联的聚焦管理逻辑导致异常(此方法会失去对话框模态效果,仅用于测试)。
内容的提问来源于stack exchange,提问作者Monotone
相关产品推荐
相关产品推荐

