2016-08-04 24 views
0

Ich baue eine einfache CRUD-Anwendung mit einer MySql-Datenbank als Back-End. Bis jetzt habe ich es geschafft, ein Gitter mit dem Inhalt eines SQLContainers mit der FreeformQuery zu verknüpfen (so dass das Lesen in Ordnung ist).Kann kein Textfeld mit RowItem von SQLContainer mit Vaadin verknüpfen

String query = "select a.id, a.name name, b.name type from asset a join " + 
" assettype b on a.assettype_id = b.id"; 

grid.setContainerDataSource(container); 

Für den Container der SQLContainer. Ich habe ein Formular, und ich habe die Bindung zwischen seinem Inhalt und einer ausgewählten Reihe

grid.addSelectionListener(event -> { 
    if (event.getSelected().isEmpty()) { 
     form.setVisible(false); 
    } else { 
     Item item = container.getItem(event.getSelected().iterator().next()); 
     form.setAsset(item); 
    } 
}); 

So, wie Sie sehen, das Formular zu einem Elemente verbunden ist. setAsset ist einfach eine Formularmethode, die den Zeileninhalt mit den Textfeldern des Formulars verknüpft.

Nun, ich weiß nicht mehr, wie man eine Zeile hinzufügt oder wie man eine bestehende Zeile bearbeitet. Zum Bearbeiten einer Reihe I mit einer Methode für das Formular speichern versucht (die ich mit einer Taste aufrufen) als

private void save() throws UnsupportedOperationException, SQLException { 
    SQLContainer container = db.getContainer(); 
    container.addItem(item); 
    container.commit(); 
} 

Nun folgt, Problem ist, dass, wenn ich ein Gitterelement auswählen, sehe ich den Inhalt des Namens und tippe die Textfelder ein, aber wenn ich ihre Werte im Textfeld ändere, bevor ich die Speichermethode eingegeben habe, hat this.item immer noch die ursprünglichen Werte (wenn ich dachte, es würde den neuen Wert im Textfeld annehmen, weil die Textfelder gebunden sind zum RowItem). Weiß jemand was los ist?

Darüber hinaus, wenn ich eine neue Zeile erstellen möchten, würde Ich mag dieses so etwas wie

Button createAsset = new Button("Add asset"); 
    createAsset.addClickListener(e -> 
    { 
     grid.select(null); 
     form.setAsset(new Item()); 
    }); 

haben und den Inhalt des Zuschnitts Item() in das Formular ausfüllen, bevor sie an die Schub Tabelle. Natürlich kann ich nicht, weil Item und RowItem Schnittstellen sind. Wie kann ich eine leere Zeile eines Containers instanziieren, bevor ich den Inhalt befülle?

Vielen Dank im Voraus.

+0

Sie wissen nicht, wie meine Frage zu bearbeiten. Die zweite Zeile des letzten Codeausschnitts sollte createAsset.addClickListener sein (e-> – edd

+0

Ich habe vergessen, das Wort Vaadin hinzuzufügen, ich habe es nur als Tag verwendet. Ich versuche das mit Vaadin zu tun. Prost – edd

+0

In der Zwischenzeit Das Problem liegt in der setAsset -Funktion (sicherlich falsche Bindung, die nur das Lesen von Daten erlaubt, aber keine Änderung des Item-Objekts) .Für das leere Item kann ich es mit form.setAsset machen (container.getItem (container.addItem())); Also, wenn Sie mir bitte sagen können, was ich falsch mache mit der Datenbindung von Item in der setAsset-Methode (die ich nur zum Lesen verwenden kann), würde ich mich freuen. – edd

Antwort

0

Am Ende würde ich sagen, dass ich entweder die Methode FieldGroup.bind nicht richtig benutze, oder dass es einen Fehler darin gibt. Dies ist mein ursprünglicher Eintrag

public void setAsset(Item item) { 
    this.item = item; 
    FieldGroup binder = new FieldGroup(this.item); 
    binder.bind(textField1, "name"); 
    binder.bind(textField2, "type"); 
    setVisible(true); 
} 

, die nicht funktioniert hat, und das ist, was funktioniert (was mir das gleiche ist)

public void setAsset(Item item) { 
     this.item = item; 
     textField1.setPropertyDataSource(item.getItemProperty("name")); 
     textField2.setPropertyDataSource(item.getItemProperty("type")); 
     setVisible(true); 
}