2009-04-14 7 views
1

Ich habe einen Gehirnkrampf, der versucht, den richtigen Weg zu JGoodies Bindings in meiner Anwendung zu verstehen.jgoodies Bindings + indirekte Änderungen

Ich habe eine Klasse Artikel, die eine Bean ist, die schreibgeschützte Eigenschaften hat. Article ist eine "einfache" Bean und verwaltet keine Eigenschaftenlistener, da sich die Eigenschaften nicht ändern. Ich habe ein Swing JPanel, mit dem ich bestimmte Eigenschaften eines Artikels anzeigen möchte. Verschiedene Artikelobjekte können zu unterschiedlichen Zeiten betrachtet werden.

Ich suche nach etwas (X), die die folgenden durch ein oder mehrere Objekte tut:

  1. X enthält den aktuell angezeigten Artikel. Ich kann X.setArticle() und X.getArticle() anrufen, um zu einem anderen Artikel zu wechseln. Es gibt keine andere Möglichkeit, den gerade angesehenen Artikel zu ändern, ich muss durch X gehen, damit er weiß, dass ich ihn ändere.
  2. Wenn ich mein JPanel einrichte, möchte ich X verwenden, um schreibgeschützte JTextFields zu erstellen, die an verschiedene Eigenschaften des aktuell angezeigten Artikels gebunden sind (Titel, Autoren usw.)
  3. (dies folgt aus # 1 und # 2) Immer wenn X.setArticle() aufgerufen wird, wird der Inhalt der Textfelder automatisch aktualisiert.

Ich habe mit BeanAdapter versucht, die Datenmodelle aus einem Artikel in einem Valueholder enthalten extrahieren und BasicComponentFactory.createTextField(), um die Textfelder zu erstellen, und es scheint, alles außer zu arbeiten, dass ich ein com.jgoodies.binding.beans.PropertyUnboundException sich beschweren, dass meine Artikelklasse ungebundene Eigenschaften hat. Duh! Ich weiß das, ich kann einfach nicht herausfinden, wie man die richtigen "Klempner" dazu bringt, damit umzugehen. Jede Article ist nicht änderbar, aber der aktuell betrachtete Artikel kann auf eine andere verweisen.

irgendwelche Vorschläge?

Antwort

1

Ich fand es heraus.

ich etwas wie folgt aus:

// on setup: 

BeanAdapter<Article> adapter = new BeanAdapter<Article>((Article)null, 
    false); 
// the "false" in the constructor means don't try to observe property 
// changes within the Article, but we still can observe changes 
// if the Article itself is replaced with a new one. 

JTextField tfAuthors = BasicComponentFactory.createTextField(
    adapter.getValueModel("authors")); 
JTextField tfTitle = BasicComponentFactory.createTextField(
    adapter.getValueModel("title")); 

Später, als ich den Artikel Objekts zu ändern, ich dies nur tun:

public void showArticle(Article article) 
{ 
    adapter.setBean(article); 
} 

und alles Updates auf dem Bildschirm sehr schön.