首页 > 解决方案 > Java FX 对话框“出现”,没有大小

问题描述

我在 Fedora 33 (GNU/Linux) 和 Xorg GUI 服务器 (v 1.20.11) 上使用 JFX 11,因此创建了一个对话框 (kotlin):

fun YNdialog (txt : String) : Boolean {
    val dlog = Dialog<ButtonType>()
    dlog.dialogPane.apply {
        contentText = txt
        buttonTypes.apply {
            add(ButtonType.OK)
            add(ButtonType.CANCEL)
        }
        minWidth = 200.0
        minHeight = 100.0
    }
    dlog.initOwner(theStage.scene.window)
    val r = dlog.showAndWait()
    return r.isPresent && r.get() == ButtonType.OK
}

这是从EventHandler<ActionEvent>与 a 关联的 a调用的Button

if (YNdialog("hello world")) ...

似乎确实创建了一个窗口。如果我删除initOwner()呼叫,它的图标会出现在桌面任务栏 (KDE) 中,允许我执行移动它之类的操作,但“最大化”和“调整大小”显示为灰色,并且鼠标光标似乎没有拖动任何内容,即,它没有宽度或高度。

有了initOwner()它,它做了很多相同的事情,除了它没有任务栏图标。此外,在它应该位于的位置(位于主窗口的中心)有一个可见的垂直线一两个像素厚。更有趣的是在主窗口的标题栏中出现了第二个关闭按钮:

在此处输入图像描述

这不是 javafx 接口的一部分,但我以前从未见过窗口管理器(?)这样做。

偶尔(可能是五分之一或十次)对话框确实会出现,奇怪的是,那里的关闭按钮会偏移第二个空格:

在此处输入图像描述

当发生这种情况并且我可以关闭对话窗口时,主窗口上的第二个关闭按钮就会消失。

使用Alert

将该功能等替换为:

Alert(Alert.AlertType.CONFIRMATION, "hello world").showAndWait() 
    .filter { res -> res == ButtonType.OK }                      
    .ifPresent { _ -> log.msg("ok!") }    

结果与带有 的 YNdialog 相同initOwner()

我在这里错过了什么吗?我从文档中直接得到了所有这些。我已经完成了自定义弹出窗口(通过 实例化FXMLLoader)并且对此没有任何问题。这种经历是否意味着对话层次结构在这种情况下存在故障,我应该自己动手?

标签: kotlinjavafxkdexorgjavafx-11

解决方案


推荐阅读