TornadoFX:标签未更新

TornadoFX: Label not updating

我有一个应用程序,我在其中使用 XSL 转换 (XSLT) 转换 XML 文档。这是使用 TornadoFX 构建的(可以找到源代码 here)。我正在尝试使用转换状态更新状态标签,这是在扩展控制器的 class 内完成的。但是由于某种原因,状态标签什么也没显示。

我的变压器的来源class:

class Transformer : Controller() {
    private val statusProperty = SimpleStringProperty("")
    var status by statusProperty

    fun transform(xml: File, xslt: File, result: StreamResult) {
        runLater { status = "" }

        // create the DOM Source
        val factory = DocumentBuilderFactory.newInstance()
        factory.isNamespaceAware = true
        val builder = factory.newDocumentBuilder()
        val bbcDoc = builder.parse(xml)
        val source = DOMSource(bbcDoc)

        // Create an instance of the TransformerFactory
        val transfomerFactory = TransformerFactory.newInstance()
        val transformer = transfomerFactory.newTransformer(StreamSource(xslt))
                .apply {
                    setOutputProperty(OutputKeys.INDENT, "yes")
                    setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4")
                }
        runLater {
            try {
                transformer.transform(source, result)
                status = "Completed successful"
            } catch (e: Exception) {
                status = e.message
            }
        }
    }
}

主界面class:

class MainScreen : View("XSLT Transformer") {

    val status: TaskStatus by inject()
    val model: TransformerModel by inject()
    val transformer: Transformer by inject()

    private val xmlFilter = arrayOf(FileChooser.ExtensionFilter("XML Filer (*.xml)", "*.xml"))

    private val xsltFilter = arrayOf(FileChooser.ExtensionFilter("XSLT Filer (*.xslt)", "*.xslt"))
    private lateinit var xmlInput: TextField
    private lateinit var xsltInput: TextField

    override val root = form {
        fieldset(labelPosition = Orientation.VERTICAL) {
            field("XSLT fil") {
                ...
            }
            field("XML Input Fil") {
                ...
            }
            button("Konverter") {
                enableWhen(model.valid)
                isDefaultButton = true
                useMaxWidth = true
                action {
                    // An object to hold the results. It can be a file.
//                    val writer = System.out
                    val output = StreamResult(StringWriter())
                    runAsyncWithProgress {
                        try {
                            transformer.status = "Konverterer xml fil..."
                            transformer.transform(File(xmlInput.text), File(xsltInput.text), output)
                            transformer.status = "Færdig"
                        } catch (e: Exception) {
                            transformer.status = e.message
                        }
                    } ui {
                        showDialogResult(output)
                        transformer.status = "Completed"
                    }
                }
            }
        }
        label(transformer.status) {
            style {
                paddingTop = 10
                textFill = Color.RED
                fontWeight = FontWeight.BOLD
            }
        }
    }
}

您必须绑定到 transformer.statusProperty,而不是 transformer.statusstatus 属性 只是一个 getter/setter 并且无法更新标签。然而 statusProperty 是可观察的,因此对其的更改将反映在标签中。

您还必须确保不要在 UI 线程上执行长 运行 任务。 runLater 计划在 UI 线程上完成工作。你想要做的是在 runAsync 块中执行长 运行 任务并添加一个 ui 块来接收结果。在 ui 块中,您可以更新 UI.