【问题标题】:Kotlin FXML file controllerKotlin FXML 文件控制器
【发布时间】:2018-06-21 21:58:48
【问题描述】:

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

当按钮被点击时,程序应该增加标签中的数字。

问题是.. 当我尝试使用如下所示的 FXML 文件时,我无法使用 onAction="#increment" 将该文件与控制器“连接”。 这将编译,但无法从 controller.kt 文件中调用增量函数。还有错误说“没有为顶级元素指定控制器”..

每当我尝试使用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
    }

}

【问题讨论】:

    标签: java javafx kotlin tornadofx


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你做得很好。但我可以再问一个问题吗?当我的 MainView.kt 与指南中的相同时,它不会编译,错误可能在“init{ counterLabel.bind(counter)}”中的某个地方......它告诉我“未解析的引用”,错误:(14, 22) 但我不知道如何解决这个问题。
    • 请在指导项目上提出问题,我会尽快查看 :)
    • 所以我已经解决了我的问题,它是由导入“java.awt.Label”而不是“javafx.scene.control.Label”引起的。所以谢谢你的时间,你帮了我很多。
    • 太棒了!感谢您的反馈:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2013-07-22
    • 2015-07-03
    • 2018-10-30
    • 2018-09-15
    • 2013-12-25
    相关资源
    最近更新 更多