Tornadofx: пытается перезагрузить / обновить sh MainView - PullRequest
0 голосов
/ 03 апреля 2020

Я только начал работать с Tornadofx, и у меня возникли некоторые проблемы, когда я пытался выяснить, как перезагрузить представление, чтобы обновить элементы управления в этом представлении.

Ниже приведена упрощенная версия код, с которым я работаю. У меня есть все oop для генерации переключателей на основе строк в списке.

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
            }
        }
    }
}

В программе мне нужно go через несколько наборов этих переключателей, и поэтому Идея заключалась в том, что каждый раз, когда пользователь нажимает кнопку «Далее», элементы в списке радио-текста будут обновляться, чтобы соответствовать следующему набору переключателей. Затем я искал способ обновить представление этими новыми значениями.

Я пытался использовать openWindow (), чтобы открыть новый экземпляр представления, но потом, когда использовал close (), чтобы избавиться от него. предыдущего экземпляра и закончил тем, что закрыл оба windows.

button("Next") {
    action {
        MainView().openWindow()
        close()
    }
}

Любая помощь с этим будет высоко ценится,

Спасибо.

1 Ответ

0 голосов
/ 14 апреля 2020

Если я правильно понял, вы пытаетесь получить список строк и генерировать с ним радиокнопки. Таким образом, добавление переменных в ваш пример будет выглядеть примерно так:

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")
            }
        }
    }
}

Пожалуйста, дайте мне знать, если есть что-то, чего вы не понимаете в моем подходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...