2016-10-29 6 views
0

So, ich habe einen Fall, in dem ich N Zeilen in Form von haben müssen: Label TextView/Checkbox. Vielleicht muss ich mehr als diese beiden Ansichten haben, also möchte ich in der Lage sein, alles zu unterstützen, was TornadoFx View ist.Erstellen Sie eine beliebige Ansicht

Ich habe eine Schnittstelle geschaffen, die eine Methode hat, die TornadoFx gibt View und es sieht wie folgt aus:

interface ValueContainer { 
    fun getView() : View 
} 

Einer der Implementierungen wie folgt aussieht:

class BooleanValueContainer(val checked: Boolean) : ValueContainer { 

    val valueProperty = SimpleBooleanProperty(checked) 

    override fun getView(): View { 
     return (object : View() { 
      override val root = checkbox { 
       bind(valueProperty) 
      } 
     }) 
    } 

}

Jetzt, wenn ich versuche, es innerhalb init Block zu verwenden, wird es nicht im Layout angezeigt. root ist GridPane und parameters ist eine Liste von Objekten, die Namen und die Bezugnahme auf ValueContainer Implementierung haben (BooleanValueContainer oder andere, die ich nicht gezeigt):

init { 
    with(root) { 
     parameters.map { 
      row(it.name) { 
       it.parameterContainer.getView() 
      } 
     } 
    } 
} 

ich hier noch eine ganze Weile bin stecken und ich Ich habe versucht alles, was ich finden konnte, aber nichts funktionierte wirklich außer textview oder checkbox Block anstelle von getView() Anruf, aber dann würde ich Logik haben auf welcher Ansicht sollte ich innerhalb dieser Klasse, die eine Ansicht darstellt, und ich will das nicht zeigen.

Antwort

1

Der Grund, warum dies für Sie nicht funktioniert, ist, dass Sie einfach parameterContainer.getView() aufrufen, aber Sie fügen die Ansicht nicht zur Zeile hinzu. Ich denke, was dich verwirrt, ist, dass man für Bauherren einfach label() sagen kann und es zum aktuellen Knoten in der Builder-Struktur hinzugefügt wird. In Ihrem Fall sagen Sie einfach Label() (erstellen Sie einfach eine Instanz von Label, nicht den Label Builder), wodurch ein neues Label erstellt, aber nicht zur Child-Liste des aktuellen Knotens hinzugefügt wird. Um Ihr Problem zu lösen, gehen Sie wie folgt vor:

this += it.parameterContainer.getView() 

Dadurch wird die Ansicht der Zeile hinzugefügt.

Abgesehen davon, sehe ich nicht den Sinn des ValueContainer. Was löst es, um eine View innerhalb dieses Containerobjekts zu platzieren? Ich vermute, dass dies auch auf ein Missverständnis zurückzuführen sein könnte und ich würde gerne verstehen, warum Sie das Gefühl haben, dass Sie dieses Konstrukt brauchen.

+0

Weil ich verschiedene Ansichten für verschiedene Datentypen anzeigen muss. Z.B. Wenn der Datentyp ein boolescher Wert ist, brauche ich ein Kontrollkästchen, wenn es eine Zeichenfolge oder Nummer ist Ich brauche ein Textfeld, wenn es ein Array von Optionen ist, brauche ich Spinner/Combobox (nicht sicher über den Namen) –

+0

Ich würde vorschlagen, in die Form-Komponente zu suchen. Überstreichen Sie Ihre Parameter, überprüfen Sie den Typ und fügen Sie den richtigen Feldeditor hinzu. Es scheint, als ob eine Ansicht pro Parameter übertrieben ist. –

Verwandte Themen