Donc, j'ai un cas dans lequel j'ai besoin d'avoir N lignes sous la forme de: Label TextView/Checkbox
. Peut-être que je devrais avoir plus que ces deux vues, donc je veux être en mesure de soutenir tout ce qui est TornadoFx View
.Créer une vue arbitraire
J'ai créé une interface qui a une méthode qui retourne TornadoFx View
et il ressemble à ceci:
interface ValueContainer {
fun getView() : View
}
L'une des implémentations ressemble à ceci:
class BooleanValueContainer(val checked: Boolean) : ValueContainer {
val valueProperty = SimpleBooleanProperty(checked)
override fun getView(): View {
return (object : View() {
override val root = checkbox {
bind(valueProperty)
}
})
}
}
Maintenant, lorsque j'essaie de l'utiliser à l'intérieur du bloc init
, il n'apparaît pas dans la présentation. root
est GridPane
et parameters
est une liste d'objets qui ont le nom et la référence à la mise en œuvre ValueContainer
(BooleanValueContainer
ou autre que je ne l'ai pas montré):
init {
with(root) {
parameters.map {
row(it.name) {
it.parameterContainer.getView()
}
}
}
}
Je suis coincé ici pour un bon moment et je J'ai essayé tout ce que je pouvais trouver mais rien n'a vraiment fonctionné sauf mettre textview
ou checkbox
bloc au lieu de getView()
appel, mais alors je devrais avoir la logique sur quelle vue devrais-je montrer dans cette classe qui représente une vue et je ne veux pas cela.
Parce que j'ai besoin d'afficher différentes vues pour différents types de données. Par exemple. Si le type de données est un booléen, j'ai besoin de checkbox, si une chaîne ou un nombre j'ai besoin de textfield, si c'est un tableau d'options, j'ai besoin de spinner/combobox (pas sûr du nom) –
Je suggère de regarder dans le composant Form. Boucle sur vos paramètres, vérifiez le type et ajoutez l'éditeur de champ correct. Il semble qu'une vue par paramètre soit trop lourde. –