Vaadin-Tabelle nicht aktualisieren in Echtzeit
Grundsätzlich dieses Programm ist eine 9x9-matrix, wo jede Zelle die aktualisiert werden müssen, mit certains zahlen.
Ich habe eine Tabelle für die matrix. Initialisiert ihn zu 0. Programm funktioniert, aber die Tabelle wird immer nur aktualisiert, einer nach dem alles erledigt ist. (eine Lösung wird gefunden).
Zellen der Tabelle werden nicht immer aktualisiert, sobald sich die Daten ändern, die hinter der Szene.
Die gesamte Tabelle wird immer aktualisiert, am Ende der Ausführung des Programms. Aber ich will sehen, jeder
Anzahl ändern, in Echtzeit, wie ich einen Wert zuweisen jeder Zelle. Jeder code ist Hilfe wirklich zu schätzen.
Ich versucht dies mit nicht mit einem container zu. aber nicht, aktualisieren Sie die Tabelle. Die Forschung, die ich habe sagt mir, dass setImmediate(true) gesetzt werden müssen auf den Tisch. Aber ich habe das ja auch schon.
Auch, die Foren sagen
Item itt = container.getItem(cell.getRowIndex() + 1);
Property<Integer> rrr = itt.getItemProperty(cell.getColumnIndex() + 1);
rrr.setValue(num);
Den obigen Zeilen sollten ausreichen, um zu reflektieren, die zahlen ändern sich in der Benutzeroberfläche. Aber es ist nicht passiert. Ich habe auch versucht
table.refreshRowCache();
table.setCacheRate(0.1);
Aber hat nicht funktioniert.
Ich habe auch im forum gelesen das die Verwendung einer valuechangelistner. Aber, ich war nicht in der Lage zu finden, ein gutes Beispiel, das zeigt mir, wie dies zu tun, iff dies ist der einzige Weg zu gehen
private Container container = new IndexedContainer();
public class MyVaadinUI extends UI {
@Override
protected void init(VaadinRequest request) {
...
for (int i = 1; i <= 9; i++) {
container.addContainerProperty(i, Integer.class, 0);
}
for (int i = 1; i <= 9; i++) {
container.addItem(i);
}
...
table.setContainerDataSource(container);
table.setImmediate(true);
...
...
/ * this is filling the table correctly with all 0's */
populate.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
...
for (int i = 1; i <= 9; i++) {
Item item = container.getItem(i);
int rowIndex = i - 1;
for (int j = 1; j <= 9; j++) {
Property<Integer> nameProperty = item.getItemProperty(j);
int columnIndex = j - 1;
nameProperty.setValue(uploadReceiver.getMatrix()[rowIndex][columnIndex]);
}
}
}
});
solveButton.addClickListener(new ClickListener() {
private boolean solveSudoko() {
...
for (int num = 1; num <= 9; num++) {
//check if no conflicts then
if (!AreThereConflicts(num, cell.getRowIndex(), cell.getColumnIndex())) {
uploadReceiver.getMatrix()[cell.getRowIndex()][cell.getColumnIndex()] = num;
//Item row = container.getItem(cell.getRowIndex() + 1);
//Property<Integer> col =
//row.getItemProperty(cell.getColumnIndex() + 1);
//col.setValue(num);
Property prop = container.getItem(cell.getRowIndex() + 1).getItemProperty(cell.getColumnIndex() + 1);
prop.setValue(num);
table.setContainerDataSource(container);
/* Table is not getting updated here ???? */
...
uploadReceiver.getMatrix()[cell.getRowIndex()][cell.getColumnIndex()] = 0; //unassign
//Item itt = container.getItem(cell.getRowIndex() + 1);
//Property<Integer> rrr =
//itt.getItemProperty(cell.getColumnIndex() + 1);
//rrr.setValue(num);
Property prop2 = container.getItem(cell.getRowIndex() + 1).getItemProperty(cell.getColumnIndex() + 1);
prop2.setValue(num);
table.setContainerDataSource(container);
/* Table is not getting updated here ???? */
}
}
return false;
}
- Ich komme Nicht auf deine Frage. Wollen Sie Ihre slipptet genehmigt( meaningbyou schon einen workaround) oder Benötigen Sie noch eine Alternative Lösung ( über den Wert ändern)?
- Ich möchte nicht ValugeChange, wenn ich nicht zu. Weil wenn ich ValueChange ich bin nur immer das Eigentum von der Veranstaltung. Ich brauche die itemId und die propertyid sowohl zum aktualisieren einer Zelle(Analogie - Reihe: itemId, Spalte: propertyid)
- Für mehr Informationen (readme) mit einem aktualisierten code finden Sie in der github.com/sbollap1/sudoku
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sich mit einem schnellen Blick, es scheint, dass alle "Wechsel-der-Zellen" Logik erfolgt in einem einzigen clickListener (D. H. innerhalb solveSoduku).
Den code in der Ereignis-listener wird passieren, in einem einzigen request/response-Zyklus, was bedeutet, dass UI nicht aktualisiert werden, bis die Methode abgeschlossen ist : dies ist ein grundlegender Bestandteil der Vaadin-Architektur.
Wenn Sie wollen, zu "sehen" die intermediate-updates haben Sie für einen hintergrund-thread zu tun, die lösen, und dann mit einem "Push" - Lösung um die Tabelle zu aktualisieren, wie Sie gehen. Vaadin 7.1.0 (vor kurzem veröffentlicht), hat push-in gebaut, ansonsten siehe dieser thread auf dem Vaadin-Foren.