TornadoFX模态框中Fragment内BarChart不更新问题求助
解决JavaFX Fragment中BarChart调用loadData后不更新的问题
我看了你的代码,发现几个关键问题导致BarChart加载数据后没显示,咱们一步步来修复:
1. 调整loadData的调用时机
你现在是在调用openModal之前就执行view.loadData(h),这时候Fragment的UI组件还没被挂载到JavaFX的场景图中,属性变更不会触发视图更新。应该把数据加载操作放到Fragment完全初始化之后执行:
修改调用代码:
val stage = Stage() stage.title = "${pointer.rname} - ${selectedFile.file.name}" val view = Histogram() val parent = StackPane() stage.scene = Scene(parent, 1280.0, 360.0) // 先打开模态框,确保视图已初始化,再加载数据 view.openModal(StageStyle.UTILITY, Modality.NONE, false, stage, false, true) view.loadData(h)
如果你的Fragment框架提供了生命周期回调(比如onShown),更稳妥的做法是在回调方法里调用loadData,确保视图已经完全就绪。
2. 避免重复添加数据系列
你的private val s = XYChart.Series<String, Number>()是类成员变量,每次调用loadData都会执行barChart.data.add(s),这会导致同一个系列被重复添加到图表中,不仅可能不显示,还会引发异常。应该在每次加载数据时清空旧数据,或者创建新的系列:
修改loadData方法:
fun loadData(h: AlignmentHistogram){ // 清空旧的数据系列,避免重复 barChart.data.clear() // 每次加载数据都创建新的系列 val s = XYChart.Series<String, Number>() s.data.add(XYChart.Data<String, Number>("asd", 2)) barChart.title = h.rname // 注释里的循环逻辑可以保留,先测试固定数据 s.data.add(XYChart.Data<String, Number>("asasdd", 5)) s.name = h.rname barChart.data.add(s) // 强制触发图表重绘(如果仍不显示的话) barChart.layout() }
3. 修正布局容器的问题
你的root容器里有一个空的hbox,它会占用布局空间,可能导致barChart被挤压无法正常显示。可以直接移除这个空容器,或者明确设置它的布局优先级:
修改root的初始化:
override val root = vbox{ hgrow = Priority.ALWAYS vgrow = Priority.ALWAYS style{ minWidth = 1280.px minHeight = 180.px } // 移除空的hbox,直接添加barChart并设置布局参数 add(barChart){ hgrow = Priority.ALWAYS vgrow = Priority.ALWAYS } add(bar){ hgrow = Priority.ALWAYS } }
同时可以去掉init块里的root.add(barChart)和root.add(bar),因为已经在DSL中完成了添加操作,避免重复添加。
4. 验证数据有效性
确保AlignmentHistogram中的数据是有效的(比如数值不为null、不为负数等),测试时可以先简化loadData的逻辑,用固定数据确认图表能正常显示后,再把循环加载的逻辑加回来。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

