本节需要导入以下3个类:
import javafx.embed.swing.SwingFXUtils
import javafx.scene.SnapshotParameters
import javax.imageio.ImageIO
为了避免代码太多,本节将部分代码移动到控制器中,新建控制器类:
import tornadofx.*
class MainController: Controller(){
val outPath= stringProperty(File("").absolutePath) //导出目录,默认为当前目录
val outNums= intProperty(5) //导出目录次数
}
将控制器注入视图view中,在view中增加如下代码:
private val c by inject<MainController>()
新建设置视图,提供对相关参数进行设置的窗口
import javafx.scene.layout.Priority
import tornadofx.*
class SettingView : View("设置") {
private val c by inject<MainController>()
override val root = borderpane {
center = vbox(5) {
hbox(5) {
label("导出目录:")
textfield(c.outPath) {
hgrow = Priority.ALWAYS
}
}
hbox(5) {
label("导出次数:")
combobox(c.outNums, (1..100 step 2).toList())
}
}
setPrefSize(500.0, 500.0)
paddingAll = 10.0
style {
fontSize = 16.px
}
}
}
在主视图view中的右侧增加一个drawer,用于显示设置视图:
right = drawer {
item<SettingView>()
}
在“刷新”按钮右侧增加“导出”按钮:
button("导出") {
action {
(1..c.outNums.value).map {i->
refreshGrid()
val img = r.snapshot(SnapshotParameters(), null)
ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", File(c.outPath.value+ "./schulteGrid$i.png"))
}
information("恭喜!成功导出 ${c.outNums.value} 张舒尔特方格。")
}
}