我有一个应用程序,在该应用程序中,我使用XSL转换(XSLT)转换XML文档。这是使用TornadoFX构建的(源代码可以找到这里)。我试图用转换的状态更新状态标签,这是在扩展Controller的类中完成的。但出于某种原因,状态标签什么也没有显示。
我的变压器类的来源:
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 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
}
}
}
}发布于 2018-09-20 13:18:44
您必须绑定到transformer.statusProperty,而不是transformer.status。status属性只是一个getter/setter,无法更新标签。然而,statusProperty是可观察的,因此对它的更改将反映在标签中。
还必须确保不要在UI线程上执行长时间运行的任务。runLater计划要在UI线程上完成的工作。您要做的是在runAsync块中执行长期运行的任务,并添加接收结果的ui块。在ui块中,您可以更新UI。
https://stackoverflow.com/questions/52424532
复制相似问题