edit: das wäre option 1 deines beitrages richtig?
Wenn du, wie Informatiker das nunmal so machen, bei 0 zu zählen anfängst: Ja
edit: das wäre option 1 deines beitrages richtig?
Wenn du, wie Informatiker das nunmal so machen, bei 0 zu zählen anfängst: Ja
extends DefaultPieDataset
public class UmsatzVerteilungsDefaultPieDataset extends DefaultPieDataset
implements PropertyChangeListener {
DisponentModel model;
public UmsatzVerteilungsDefaultPieDataset(DisponentModel model) {
this.model = model;
this.model.getPropertyChangeSupport().addPropertyChangeListener(this);
fillModel();
}
public UmsatzVerteilungsDefaultPieDataset(DisponentModel model, KeyedValues data) {
super(data);
this.model = model;
this.model.getPropertyChangeSupport().addPropertyChangeListener(this);
fillModel();
}
private void fillModel() {
Collection<Rechnung> billings = this.model.getBillingList().values();
Iterator<Rechnung> iter = billings.iterator();
while (iter.hasNext()){
Rechnung billing = iter.next();
Iterator<Rechnungsposition> repos = billing.getRechnungsPositionen().iterator();
while (repos.hasNext()) {
Rechnungsposition repo = repos.next();
if (this.getKeys()
.contains(repo.getArtikel())) {
this.setValue(
repo.getArtikel(),
this
.getValue(repo.getArtikel())
.doubleValue()
+ repo.getGesamtPreis());
} else {
this.setValue(
repo.getArtikel(), repo.getGesamtPreis());
}
}
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) { [...]
}
}
Iterator<SomeClass> iterator = someCollection.iterator();
while (iterator.hasNext())
{
SomeClass object = iterator.next();
workWith(object);
}
for (SomeClass object : someCollection)
{
workWith(object);
}
DisponentModel_ImplBase (PropertyCHangeSUpport)
-->Disponent Model
-->Artikel
-->Hersteller
-->usw.
Controller (füllt model und sowas)
DisponentView (PropertyCHangeListener)
nd nen Artikel hinzufügt und so weiter...
Jetzt würde mich brennend interessieren wie ich es einrichte dass ich mitbekomme wenn sich ein Artikel geändert hat. Ich werde ja jetzt nicht daher gehen und jedem Artikel die View als PropertyCHangeListener übergeben oder? Also was hänge ich nun wie an die Artikel (Der Support ist eingerichtet)?
artikelModel.addChangeListener(new ProprtyChangeListener...)
while (rs.next()) {
Artikel art = new Artikel();
art.getChangeSupport().addPropertyChangeListener(view);
.....
}
also ist es wirklich so dass ich immer wenn ich einen Artikel erstelle, also zb. beim initialen Model füllen bei jedem schleifendurchlauf durch das ResultSet sowas hier mache.
Java:while (rs.next()) { Artikel art = new Artikel(); art.getChangeSupport().addPropertyChangeListener(view); ..... }
ist das richtig? Und vor allem hält doch der COntroller keine referenz auf die view eigentlich oder? d.h. ich kan doch im COntroller garnicht "wirklich" den PropertyChangeListener da rein hängen...
Muss ich also im propertyCHange das geworfen wird wenn ein Artikel hinzugefügt wird diesem Artikel den Listener rein hängen!?
was meinst du denn jetztmit gemischt?
Habe es doch nun so gemacht wie du mir vorgeschlagen hast.
Domain model: Artikel, Rechnung, Hersteller (nur Datenklassen) ||||, Disponent Model (hält listen der Artikel, rechnung etc)
Controller: füllt model,...
GUIModel: TreeModel, ListModels, usw
GUIController: anonyme Listener und einzeln implementierte Listener etc.
GUI: nur View Code der die GUI Controller anbindet und referenz auf Contoller hat, CellRenderer, PropChangeListener
was is denn daran jetzt vermischt? UNd wie kann die View sich selbst bei jedem Artikel der erstellt wird (initial) anmelden wenn sie mit der befüllung ja eig ausser den PropertyChangeEvents die durch das Adden der Artikel zur Artikelliste ausgelöst werden?
while (rs.next()) {
Artikel art = new Artikel();
art.getChangeSupport().addPropertyChangeListener(view);
.....
}
wie melde ich denn sonst beim erstellen des Artikels die View/ irgendeinen Controllr beim Artikel an?
Mein Disponenten Model hält listen aus Artikel, Rechnung, etc.,...
mein Controller greift auf di DB zu und erstellt diese Disponenten Model.
meine View bekomt controller und Model übergeben.--> View meldet sich beim Model als Listener an. (achtung hier meldet er sich nur für Änderungen an den Listen an) und das geht ja einfach so initial mit ein mal anmelden.
mein Model macht zb irgendwann mal...
setListData(model.getArtikelListe().toArray);
jetzt müsste das MOdel noch mtibekommen wenn sich artikel details ändern...also das Model am Artikel anmelden...Das ist jetzt die Frage wie das geht...So wie ich das oben geschrieben habe ist es ja im moment noch nciht.das wäre nur meine idee...also den Controller eine Referenz uf di View halten lassen (mit INterface PropertyChangeListener ( den müssen ja alles views die es dazu gibt haben)) und beim Model füllen einfach nru die referenzder View als Listener bei einzelnen Artikelobjekten anmelden.
Wie wird das denn richtig gemacht?
gut also iteriere ich nach dem erstellen der View (wo das Model ja schon steht) über alle meine Listen und füge die View als Listener an die (jeden einzelnen) Artikel z.b...
Das ADD_Artikel event kann ja erst ankommen wenn view am Model angemeldet ist und Model erst danach gefüllt wird.
PS: Die Listener müsste ich ja entweder beim löschen eines Artikels bzw beim beenden des Programms entfernen richtig!?
DisponentModel model = new DisponentModel ();
Controller conroller = new Controller(model, dbVerbindung);
View view = new View(model, controller);
controller.fillModel();
ok ich mache es nun so in der "main" methode:
Java:DisponentModel model = new DisponentModel (); Controller conroller = new Controller(model, dbVerbindung); View view = new View(model, controller);
Jetzt frage ich mich nur wie ich anschiebe dass ich danach das Modell füllen will. Mache ich dass immernoch in der main Methode dann?
so etwa:
Java:controller.fillModel();
Oder gibt es da eine andere Vorgehensweise?
public void setId(Integer id) {
changeSupport.firePropertyChange("id", this.id = id, id);
}
public void setId(Integer id) {
int old = this.id;
this.id = id;
changeSupport.firePropertyChange("id", old, this.id);
}
nochmal ich.. du hast oben geschrieben:
Java:public void setId(Integer id) { changeSupport.firePropertyChange("id", this.id = id, id); }
bist du dir sicher dass dann ebi Listenern das propertyCHAnge ankommt? bei mir funktioniert es so nciht...dafür wenn ich es so mache :
Java:public void setId(Integer id) { int old = this.id; this.id = id; changeSupport.firePropertyChange("id", old, this.id); }
So finde ich das aber irgendwie nicht so doll ... geht das bei dir denn nach der 1. methode? ist ja irgendwie komisch..
changeSupport.firePropertyChange("id", this.id , this.id = id);
@Override
public void propertyChange(final PropertyChangeEvent evt) {
// SwingUtilities.invokeLater(new Runnable() {
// @Override
// public void run() {
String propName = evt.getPropertyName();
if (propName.equals("AddBilling")) {
getBillingList().setListData(
model.getBillingList().values().toArray());
} else if (propName.equals("AddHistoryEntry")) {
getLagerActivityList().setListData(
model.getHistoryList().values().toArray());
} else if (propName.equals("AddWorkItem")
|| propName.equals("RemoveWorkItem")) {
getTodoList().setListData(model.getWorkItemsList().toArray());
}
// }
// });
}