JavaFX透明Stage设置宽高报错,求排查是Bug还是操作问题
透明Stage调整尺寸报错的问题分析与解决
这是JavaFX在Linux GTK桌面环境下使用StageStyle.TRANSPARENT时的已知兼容性问题,并非你的代码操作有误。
问题原因
当直接调用Stage.setWidth()或setHeight()修改透明Stage的尺寸时,JavaFX与GTK窗口管理器的交互存在bug,导致GTK无法正确获取到有效的窗口高度(被错误计算为0),触发了gtk_window_resize的height > 0断言检查,从而抛出错误。
解决方案
不要直接修改Stage的尺寸,改为调整关联的Scene的宽高,JavaFX会自动同步Stage的大小,绕过GTK的断言问题。
修改后的代码示例:
public class Test11 extends Application { @Override public void start(Stage primaryStage) { var button = new Button("Test"); button.setOnAction(e -> { Scene scene = primaryStage.getScene(); scene.setWidth(scene.getWidth() - 10); // 如果需要调整高度,同样修改scene的height即可 // scene.setHeight(scene.getHeight() - 10); }); var vBox = new VBox(button); vBox.setStyle("-fx-background-color: yellow"); var scene = new Scene(vBox, 400, 300); primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
补充说明
如果需要同时调整宽高,直接调用scene.setWidth()和scene.setHeight()即可,这种方式能确保GTK窗口管理器接收到有效的非零尺寸值,避免触发断言错误。
内容的提问来源于stack exchange,提问作者SilverCube
相关产品推荐
相关产品推荐

