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.status
。 status
属性 只是一个 getter/setter 并且无法更新标签。然而 statusProperty
是可观察的,因此对其的更改将反映在标签中。
您还必须确保不要在 UI 线程上执行长 运行 任务。 runLater
计划在 UI 线程上完成工作。你想要做的是在 runAsync
块中执行长 运行 任务并添加一个 ui
块来接收结果。在 ui
块中,您可以更新 UI.
我有一个应用程序,我在其中使用 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.status
。 status
属性 只是一个 getter/setter 并且无法更新标签。然而 statusProperty
是可观察的,因此对其的更改将反映在标签中。
您还必须确保不要在 UI 线程上执行长 运行 任务。 runLater
计划在 UI 线程上完成工作。你想要做的是在 runAsync
块中执行长 运行 任务并添加一个 ui
块来接收结果。在 ui
块中,您可以更新 UI.