2016-10-29 1 views
0

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.

Répondre

1

La raison pour laquelle cela ne fonctionne pas est que vous appelez simplement parameterContainer.getView() mais vous n'ajoutez pas la vue à la ligne. Je pense que ce qui vous déroute, c'est que pour les constructeurs, vous pouvez simplement dire label() par exemple, et il est ajouté au nœud actuel dans l'arborescence du générateur. Dans votre cas, vous dites simplement Label() (créez simplement une instance de Label, sans appeler le constructeur d'étiquettes), ce qui créerait une nouvelle étiquette, mais ne l'ajouterait pas à la liste des enfants du nœud actuel. Pour résoudre votre problème, faites:

this += it.parameterContainer.getView() 

Ceci ajoutera la vue à la ligne. En dehors de cela, je ne vois pas vraiment le point de ValueContainer. Que résout-il de mettre une vue à l'intérieur de cet objet conteneur? Je soupçonne que cela pourrait aussi être dû à un malentendu et j'aimerais comprendre pourquoi vous pensez que vous avez besoin de cette construction.

+0

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) –

+0

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. –