You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:37:05