Tornadofx:尝试 reload/refresh MainView
Tornadofx: Trying to reload/refresh MainView
我才真正开始使用 Tornadofx,在尝试弄清楚如何重新加载视图以便刷新该视图中的控件时遇到了一些麻烦。
下面是我正在使用的代码的简化版本。我有一个循环可以根据列表中的字符串生成单选按钮控件。
class MainView: View("MainView") {
override val root = vbox {
for(x in radioText) {
radiobutton(x, radioGroup) {
action {
radioSelected = this@radiobutton.text
}
}
}
button("Next") {
action {
// Reload View to update radiobuttons with new values
}
}
}
}
在程序中我需要遍历几组这样的单选按钮,所以我的想法是每次用户按下 "Next" 按钮时,radioText 列表中的项目都会更新以匹配下一组单选按钮。然后我在寻找一种方法来让视图更新这些新值。
我尝试使用 openWindow() 打开视图的一个新实例,但是当我使用 close() 摆脱之前的实例并最终关闭两个 windows.
button("Next") {
action {
MainView().openWindow()
close()
}
}
如有任何帮助,我们将不胜感激,
谢谢。
如果我没理解错的话,你是想得到一个字符串列表并用它生成单选按钮。因此,通过将变量添加到您的示例中,将是这样的:
class MainView: View("MainView") {
val radioText = ArrayList<String>()
var radioGroup : ToggleGroup by singleAssign()
lateinit var radioSelected : String
override val root = vbox {
radioText.addAll(arrayListOf("One","Two","Three","Four"))
radioGroup = togglegroup(){}
for(x in radioText) {
radiobutton(x,radioGroup) {
action {
radioSelected = text //You don't need this@radiobutton.text
}
}
}
button("Next") {
action {
// Reload View to update radiobuttons with new values
}
}
}
}
我最好让你的单选按钮由一个列表视图创建,它会被一个可观察的字符串列表更新,就像我在下面做的那样:
class MainView2: View("MainView") {
// this is a list of observable string, so when the items on his list change
// the listview is updated
val radioText = FXCollections.observableArrayList<String>()
var radioGroup : ToggleGroup by singleAssign()
lateinit var radioSelected : String
override val root = vbox() {
prefWidth = 200.0
prefHeight = 300.0
radioText.setAll("One","Two","Three","Four")
radioGroup = togglegroup(){}
listview<String>(radioText){
// Setting listview height dinamically
fixedCellSize = 25.0
prefHeightProperty().bind(radioText.sizeProperty.multiply(fixedCellSizeProperty().add(2)))
// Generating the radiobutton acording to strings on radioText
cellFormat {
graphic = cache(it){
radiobutton(it,radioGroup){
action {
radioSelected = text
}
}
}
}
}
button("Next") {
action {
radioText.clear()
radioText.setAll("Five","Six","Seven","Eight","Nine","Ten")
}
}
}
}
如果您对我的方法有不理解的地方,请告诉我。
我才真正开始使用 Tornadofx,在尝试弄清楚如何重新加载视图以便刷新该视图中的控件时遇到了一些麻烦。
下面是我正在使用的代码的简化版本。我有一个循环可以根据列表中的字符串生成单选按钮控件。
class MainView: View("MainView") {
override val root = vbox {
for(x in radioText) {
radiobutton(x, radioGroup) {
action {
radioSelected = this@radiobutton.text
}
}
}
button("Next") {
action {
// Reload View to update radiobuttons with new values
}
}
}
}
在程序中我需要遍历几组这样的单选按钮,所以我的想法是每次用户按下 "Next" 按钮时,radioText 列表中的项目都会更新以匹配下一组单选按钮。然后我在寻找一种方法来让视图更新这些新值。
我尝试使用 openWindow() 打开视图的一个新实例,但是当我使用 close() 摆脱之前的实例并最终关闭两个 windows.
button("Next") {
action {
MainView().openWindow()
close()
}
}
如有任何帮助,我们将不胜感激,
谢谢。
如果我没理解错的话,你是想得到一个字符串列表并用它生成单选按钮。因此,通过将变量添加到您的示例中,将是这样的:
class MainView: View("MainView") {
val radioText = ArrayList<String>()
var radioGroup : ToggleGroup by singleAssign()
lateinit var radioSelected : String
override val root = vbox {
radioText.addAll(arrayListOf("One","Two","Three","Four"))
radioGroup = togglegroup(){}
for(x in radioText) {
radiobutton(x,radioGroup) {
action {
radioSelected = text //You don't need this@radiobutton.text
}
}
}
button("Next") {
action {
// Reload View to update radiobuttons with new values
}
}
}
}
我最好让你的单选按钮由一个列表视图创建,它会被一个可观察的字符串列表更新,就像我在下面做的那样:
class MainView2: View("MainView") {
// this is a list of observable string, so when the items on his list change
// the listview is updated
val radioText = FXCollections.observableArrayList<String>()
var radioGroup : ToggleGroup by singleAssign()
lateinit var radioSelected : String
override val root = vbox() {
prefWidth = 200.0
prefHeight = 300.0
radioText.setAll("One","Two","Three","Four")
radioGroup = togglegroup(){}
listview<String>(radioText){
// Setting listview height dinamically
fixedCellSize = 25.0
prefHeightProperty().bind(radioText.sizeProperty.multiply(fixedCellSizeProperty().add(2)))
// Generating the radiobutton acording to strings on radioText
cellFormat {
graphic = cache(it){
radiobutton(it,radioGroup){
action {
radioSelected = text
}
}
}
}
}
button("Next") {
action {
radioText.clear()
radioText.setAll("Five","Six","Seven","Eight","Nine","Ten")
}
}
}
}
如果您对我的方法有不理解的地方,请告诉我。