TornadoFX视图片段替换异常:无需重建父视图的解决办法?
TornadoFX BorderPane替换中部Fragment后其他组件消失问题
我在TornadoFX中采用BorderPane布局,该布局包含三个组件,中部为一个Fragment(红框标注)。预期切换顶部任意菜单时,中部Fragment会被新生成的Fragment替换,但实际操作后,屏幕仅保留原Fragment,其余组件全部消失。
相关简化代码如下:
父视图代码:
override val root = borderpane { top = menus.root center = searchBoxes.root bottom = bottomHalf.root }
替换函数代码:
fun swapSearchBoxes() { val parentView = find(GfeSearchViewParent::class) val newSearchBoxes = stateContext.createNewSearchBoxes() parentView.root.center.replaceWith(newSearchBoxes.root) }
请问是否有无需重建整个父视图的解决方法?
解决方法
问题出在replaceWith的默认行为上:它会将目标组件从原父容器移除并替换当前组件的父容器结构,这才导致了top和bottom区域组件消失。以下两种无需重建父视图的修复方式:
直接重新赋值BorderPane的center属性
跳过replaceWith,直接给父视图的BorderPane center属性赋值新Fragment的root,BorderPane会自动处理旧组件的移除与新组件的添加,不会影响其他区域:fun swapSearchBoxes() { val parentView = find(GfeSearchViewParent::class) val newSearchBoxes = stateContext.createNewSearchBoxes() (parentView.root as BorderPane).center = newSearchBoxes.root }调用replaceWith时指定keepParent参数
如果坚持使用replaceWith,需设置keepParent = true,仅替换center区域内的组件内容,保留父容器结构:fun swapSearchBoxes() { val parentView = find(GfeSearchViewParent::class) val newSearchBoxes = stateContext.createNewSearchBoxes() parentView.root.center.replaceWith(newSearchBoxes.root, keepParent = true) }
内容的提问来源于stack exchange,提问作者Katrina Eaton
相关产品推荐
相关产品推荐

