首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TornadoFX:标签不更新

TornadoFX:标签不更新
EN

Stack Overflow用户
提问于 2018-09-20 11:50:01
回答 1查看 624关注 0票数 2

我有一个应用程序,在该应用程序中,我使用XSL转换(XSLT)转换XML文档。这是使用TornadoFX构建的(源代码可以找到这里)。我试图用转换的状态更新状态标签,这是在扩展Controller的类中完成的。但出于某种原因,状态标签什么也没有显示。

我的变压器类的来源:

代码语言:javascript
复制
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
            }
        }
    }
}

主屏幕类:

代码语言:javascript
复制
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
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-20 13:18:44

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52424532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档