TornadoFX: ярлык не обновляется - PullRequest
       10

TornadoFX: ярлык не обновляется

0 голосов
/ 20 сентября 2018

У меня есть приложение, в котором я преобразую XML-документ, используя XSL-преобразование (XSLT).Это сборка с использованием 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
            }
        }
    }
}

1 Ответ

0 голосов
/ 20 сентября 2018

Вы должны связать с transformer.statusProperty, а не с transformer.status.Свойство status является просто средством получения / установки и не может обновлять метку.Howere statusProperty является наблюдаемым, поэтому изменения в нем будут отражены в метке.

Вы также должны следить за тем, чтобы не выполнять долго выполняющиеся задачи в потоке пользовательского интерфейса.runLater планирует работу в потоке пользовательского интерфейса.То, что вы хотите сделать, это выполнить длительные задачи в блоке runAsync и добавить блок ui, который получает результат.В блоке ui вы можете обновить пользовательский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...