TornadoFX Fragment OpenWindow 总是在最前面

TornadoFX Fragment OpenWindow is always on top

我正在使用 TornadoFX 的 fragment class,并使用它的 openWindow() 方法在新的 window 中打开每个新的 fragment

window打开,一切正常。我已将模态设置为 Modality.NONE,以便在新片段处于活动状态时可以访问原始屏幕。

我遇到的问题是新的 window 总是 在最上面,所以我必须移动它才能访问原来的 window 下面是不理想的。

这是 design/is 改变这种行为的方式吗?

我一直在研究 openWindow()s owner = 参数,将其设置为 null 和另一个 Stage 但似乎没有任何效果。

首先,打开window的代码,view是片段。

//h here is just the histogram, an int[] 
val hisScope = HistogramScope(h, pointerVM.APUFile.file.name)

//view declared using the find method.
val view = find<Histogram>(hisScope)

view.whenUndocked {
  closeChart(pointerVM)
}

//code checks to see if the requested histogram is already open
val matchingRnameHistograms = isMatchingRnameOpen(pointerVM)

if (map.size == 0 || matchingRnameHistograms.isEmpty()) {

view.openWindow(stageStyle = StageStyle.UTILITY, modality = Modality.NONE, resizable = false, owner = null, block = false)

map.put(pointerVM, view) //record which histograms are open

} else { //.. not too relevant }

接下来,这是我用以下范围声明片段的方式:

class Histogram : Fragment() {

override val scope = super.scope as HistogramScope

override val root = hbox{

    hgrow = Priority.ALWAYS
    vgrow = Priority.ALWAYS

    style{
        minWidth = 1280.px
        minHeight = 250.px
    }

}

提前致谢!

当您在另一个上下文中打开一个新的 window 时,owner 属性默认设置为原始 UIComponent。您可以将 owner = null 传递给 openWindow 来防止这种情况,从而允许 window 被放置在原始的下方。这是一个完整的应用程序,展示了它是如何工作的:

class MyApp : App(MainView::class)

class MainView : View() {
    override val root = stackpane {
        setPrefSize(800.0, 600.0)
        button("Open new window").action {
            find<NewWindow>().openWindow(owner = null)
        }
    }
}

class NewWindow : Fragment() {
    override val root = label("I'm not modal!")
}

如果您仍然无法让它工作,请尝试减少代码中的因素数量:)