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

Ubuntu 22.04下JavaFX应用窗口抖动与菜单脱离问题求助

问题描述

在Ubuntu 22.04系统中运行JavaFX应用时出现以下异常:

  • 打开新窗口或消息框时,窗口及消息框会短暂抖动
  • 移动窗口时,已展开的菜单会脱离窗口

该应用在Lubuntu 22.04及Windows 10系统中运行正常。

复现代码如下:

import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;

public class Application extends javafx.application.Application {
    @Override
    public void start(Stage stage) throws IOException {
        MenuBar menuBar = new MenuBar();
        Menu menu = new Menu("Menu");
        MenuItem menuItem1 = new MenuItem("MenuItem 1");
        MenuItem menuItem2 = new MenuItem("MenuItem 2");
        menuBar.getMenus().add(menu);
        menu.getItems().addAll(menuItem1, menuItem2);
        menuBar.setPrefHeight(30d);
        Button button = new Button("Messagebox");
        button.prefWidth(100d);
        button.prefHeight(30d);
        button.setOnAction(actionEvent -> {
            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setTitle("Messagebox");
            alert.setHeaderText(null);
            alert.setContentText("Message...");
            alert.showAndWait();
        });
        StackPane stackPane = new StackPane(button);
        stackPane.setPadding(new Insets(50));
        VBox vbox = new VBox();
        vbox.getChildren().add(menuBar);
        vbox.getChildren().add(stackPane);
        Scene scene = new Scene(vbox);
        stage.setWidth(500);
        stage.setHeight(400);
        stage.setTitle("Hello!");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }
}
解决方案

这类问题通常是Ubuntu 22.04默认的GNOME桌面与JavaFX窗口渲染后端不兼容导致的,可尝试以下几种解决方法:

1. 切换JavaFX窗口渲染后端

运行应用时添加启动参数,强制使用GTK3后端:

java -Djdk.gtk.version=3 -jar your-app.jar

若使用Maven/Gradle运行,可在VM参数中加入该配置。

2. 禁用客户端窗口装饰

通过启动参数让系统负责窗口装饰:

java -Djavafx.platform=gtk -Djavafx.stage.style=DECORATED -jar your-app.jar

也可在代码中直接设置Stage样式:

stage.initStyle(StageStyle.DECORATED);

3. 安装GTK3依赖库

确保系统已安装必要的GTK3组件:

sudo apt install libgtk-3-0 libgtk-3-dev

4. 升级OpenJFX版本

若当前使用的JavaFX版本较旧,升级到最新稳定版(如17.x或21.x),新版本通常修复了更多桌面环境兼容性问题。

5. 切换到Xorg会话

Ubuntu 22.04默认使用Wayland会话,部分JavaFX应用在Wayland下存在渲染异常。登录时选择「Ubuntu on Xorg」会话后再运行应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:15:54