Kotlin FXML 文件控制器

Kotlin FXML file controller

我正在尝试使用 Kotlin 和 JavaFX(TornadoFX) 制作基本的桌面应用程序,但我一直在为 FXML 文件设置控制器。 我在 git LINK to git.

上关注 edvin 的指南

程序应在单击按钮时递增标签中的数字。

问题是.. 当我尝试使用如下所示的 FXML 文件时,我无法通过控制器使用 onAction="#increment" 到 "connect" 该文件。 这将编译,但无法从 controller.kt 文件调用增量函数。还有错误说 "No controller specified for top level element" ..

每当我尝试使用 fx:controller=view.Controller 指定控制器时,代码甚至无法编译,显示错误:

javafx.fxml.LoadException: Controller value already specified. 

有人可以帮我吗?

这是 FXML 文件

?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<BorderPane xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1">
    <padding>
        <Insets top="20" right="20" bottom="20" left="20"/>
    </padding>

    <center>
        <VBox alignment="CENTER" spacing="10">
            <Label text="0">
                <font>
                    <Font size="20"/>
                </font>
            </Label>
            <Button text="Click to increment" onAction="#increment"/>
        </VBox>
    </center>
</BorderPane>

这里是MyApp.kt(主文件):

package app

import javafx.stage.Stage
import tornadofx.*
import view.MainView

class MyApp: App(MainView::class){
    override val primaryView = MainView::class

    override fun start(stage: Stage) {
        stage.minHeight = 400.0
        stage.minWidth = 600.0
        super.start(stage)
    }

}

这里是MainView.kt(查看):

package view

import javafx.scene.layout.BorderPane
import tornadofx.*

class MainView : View() {

    override val root: BorderPane by fxml("/views/MainViewFXML.fxml" )
}

这里是Controller.kt(这个应该用来控制FXML文件的动作):

package view

class Controller {

    fun increment(){
        //code
    }

}

在 TornadoFX 中,视图 控制器。将视图子类视为视图控制器。对 View 中的 UI 事件做出反应,并将业务逻辑传递给 ViewModel 或 Controller 子类。

将您的 increment 函数放在 MainView 中,它将被调用 :) 删除 fx:controller=view.Controller 属性。