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
属性。
我正在尝试使用 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
属性。