Praktische Einführung in die Datenhaltung von Vaadin

Seite 4: Alles im Fluss

Inhaltsverzeichnis

Technische Artikel haben immer auch die Aufgabe, Schwächen des besprochenen Produkts zu zeigen. Im Fall von Vaadin ist das größte Ärgernis sicherlich die Sturheit des Tabellensteuerelements. Hierzu etwas Motivation: Edelmetallpreise haben die unangenehme Eigenschaft, zeitlichen Schwankungen zu unterliegen. Deswegen soll das an dieser Stelle eine Erweiterung der Bean abbilden, die ihren Wert durch einen Zufallsgenerator verändert. Dazu ist im ersten Schritt ein Trigger notwendig, der den Preis regelmäßig austauscht:

public class HeiseBean  extends TimerTask implements Serializable {...
Random myRandom;

@Override
public void run() {
myPrice=myRandom.nextFloat()*255;

}

public HeiseBean(String _n, Float _p){
...
myRandom=new Random();
}

Aus technischer Sicht findet sich hier nur wenig Neues: Entwickler schreiben der Bean einen TimerTask ein, den im nächsten Schritt ein Timer aktivieren kann. Aus Gründen der Bequemlichkeit erledigt man das im Konstuktor von EnterView:

public class EnterView extends VerticalLayout implements View, ValueChangeListener {
...
Timer myTimer;

@Override
public void enter(ViewChangeEvent event) {
...
myTimer=new Timer();
HeiseBean b;
myCollection.setBeanIdProperty("myName");
b= new HeiseBean("Gold", (float) 1866.0);
myTimer.schedule(b, 2500, 2500);
myCollection.addBean(b);
...

Rein theoretisch sollte die Tabelle an dieser Stelle automatisch aktualisiert werden. Wer die Applikation in einem Browser seiner Wahl (oder in Eclipse) öffnet, stellt allerdings ernüchtert fest, dass nichts dergleichen passiert. Der Grund dafür findet sich im Design der Sprache. Auch Java kennt von Haus aus keinen Weg, um sich für Änderungen am Wert einer bestimmten Variable anzumelden. Im Fall einer JavaBean gibt es stattdessen eine Spezifikation für das Emittieren von Änderungs-Notifications: ein Verfahren, das an dieser Stelle ausprobiert werden soll.

Java unterstützt Entwickler durch die PropertyChangeSupport-Klasse: Es handelt sich dabei um ein Helferlein, das diverse Logik zum Verwalten und Aktivieren von PropertyChanged-Listenern bereitstellt. Nach dem Einbinden als Member der HeiseBean müssen Entwickler die Methode firePropertyChange aufrufen, wann immer eine Aktualisierung eines Werts zu bearbeiten ist:

public class HeiseBean  extends TimerTask implements Serializable {
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
...

@Override
public void run() {
myPrice=myRandom.nextFloat()*255;
this.pcs.firePropertyChange("myPrice", 0, myPrice);
}

firePropertyChange erwartet einen Vorher- und einen Nachher-Parameter. Das hier gezeigte Nullsetzen von before ist insofern kritisch, als die PropertyChangeEvent-Logik identische Ereignisse ausfiltert: Wenn myPrice plötzlich null werden würde, fiele das Ereignis unter den Tisch. In dem eher einfachen Fall hier tangiert das allerdings nicht weiter. Wichtiger ist, dass sich die Tabelle auch zu diesem Zeitpunkt noch nicht automatisch aktualisiert. Der Grund dafür ist das Fehlen von Logik, die die von der Bean ausgegebenen Ereignisse weiterverarbeitet. Das Framework zeigt sich an dieser Stelle insofern unflexibel, als es keinen Weg zur programmatischen Aktualisierung einer Tabelle gibt.

Mehr Infos

Spalte, ändere dich!

Vaadin-Tabellen sind nicht auf das passive Anzeigen von Informationen beschränkt: Entwickler können die Container auch zur Anzeige aktiver Steuerelemente einsetzen, die den Usern das Verändern der in ihnen enthaltenen Informationen ermöglichen. Mehr Auskunft hierzu findet sich in der Dokumentation – die hier und hier bereitstehenden Beispiele sind ein guter Einstieg.