Hallo,
ich habe das Laden von Stichworten aus einer Datenbank in eine JList vorsorglich in einen SwingWorker ausgelagert, da Datenbaken und Netzwerke ja bekanntlich etwas lahm sein können.
Damit dieser SwingWorker nun die Liste füllen kann, übergebe ich seinem Konstruktor das Model der Liste:
Das Ausführen übernimmt eine zentrale Status-Klasse. (Deren Funktionalität sichergestellt ist, da andere SwingWorker problemlos ausgeführt werden)
Wie ich an den Log-Daten erkennen kann, holt sich der SwingWorker die richtigen Daten aus der Datenbank und gibt beim Ändern des Models (wieder im EDT) keinerlei Fehler aus.
Jedoch kommen diese Änderungen nie auf der Oberfläche an!
Das hat mich vermuten lassen, dass das Model an irgendeiner Stelle nicht verändert, sondern neu initialisiert wird.
Wo könnte das passieren?
(Nicht über den extensiven gebrauch des Loggers wundern, ich verzweifel schon länger :? )
Zum StichwortListModel sei noch hinzugefügt, dass es sich um eine Klasse Handelt, die das DefaultListModel überschreibt und als Speicher eine LinkedList<Strichwort> benutzt.
soweit mein Problem, sieht Irgendwer eine Lösung?
MfG
Carsten
EDIT: Oder könnte das was mit der Sichtbarkeit des Models zu tun haben, das eine private Membervariable ist, und in einem anderen Paket steht (zusammen mit der JList) ??
ich habe das Laden von Stichworten aus einer Datenbank in eine JList vorsorglich in einen SwingWorker ausgelagert, da Datenbaken und Netzwerke ja bekanntlich etwas lahm sein können.
Damit dieser SwingWorker nun die Liste füllen kann, übergebe ich seinem Konstruktor das Model der Liste:
Code:
sw = new AllStw((StichwortListModel)getAllStwList().getModel(), werk);
Das Ausführen übernimmt eine zentrale Status-Klasse. (Deren Funktionalität sichergestellt ist, da andere SwingWorker problemlos ausgeführt werden)
Wie ich an den Log-Daten erkennen kann, holt sich der SwingWorker die richtigen Daten aus der Datenbank und gibt beim Ändern des Models (wieder im EDT) keinerlei Fehler aus.
Jedoch kommen diese Änderungen nie auf der Oberfläche an!
Das hat mich vermuten lassen, dass das Model an irgendeiner Stelle nicht verändert, sondern neu initialisiert wird.
Wo könnte das passieren?
Code:
public class AllStw extends SwingWorker<LinkedList<Stichwort>, Stichwort> implements DB_settings {
private static Logger log = BDBi.getLogger();
private LinkedList<Stichwort> usedStw;
private StichwortListModel model;
public AllStw (StichwortListModel model, Kuenstler usedKuenstler) {
this.model = model;
usedStw = new LinkedList<Stichwort>(usedKuenstler.getVknStw());
}
public AllStw (StichwortListModel model, Werk usedWerk) {
this.model = model;
usedStw = new LinkedList<Stichwort>(usedWerk.getVerknStw());
}
public AllStw (StichwortListModel model, Werk usedWerk, Kuenstler usedKuenstler) {
this.model = model;
usedStw = new LinkedList<Stichwort>(usedWerk.getVerknStw());
usedStw.addAll(usedKuenstler.getVknStw());
}
@Override
protected LinkedList<Stichwort> doInBackground() throws Exception {
LinkedList<Stichwort> res = new LinkedList<Stichwort>();
Connection c = DriverManager.getConnection("proxool.BDB");
log.entering(this.getClass().getSimpleName(), "doInBackgrund");
try {
ResultSet rs = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY)
.executeQuery(""+
" SELECT" +
" s.*" +
" FROM" +
" "+DB_SCHEMA+".stichwort AS s" +
" ORDER BY" +
" wort");
rs.last();
double progressPerRow = rs.getRow() / 100;
rs.beforeFirst(); //cursor wieder vor die erste Reihe bewegen, damit mann alle Reihen der Reihe nach abgehen kann
while (rs.next()) {
if(this.isCancelled())
return null;
Stichwort s = new Stichwort(rs.getString("wort"), //wort
rs.getString("abkuerzung"), //abk.
rs.getInt("stichw_id") //id
);
if (!usedStw.contains(s)) {
res.add(s);
publish(s);
}
this.setProgress((int)(this.getProgress() + progressPerRow));
}
} finally {
SQLWarning w = c.getWarnings();
if(w!=null)
log.fine("SQL Warning: " + w.getMessage());
c.close();
log.finer("Verbindung zum Lesen aller Stichworte geschlossen.");
}
log.exiting(this.getClass().getSimpleName(), "doInBackground", res);
return res;
}
@Override
protected void process(List<Stichwort> chunks) {
log.entering(this.getClass().getSimpleName(), "process", chunks);
for (Stichwort stw : chunks) {
model.addElement(stw);
}
log.exiting(this.getClass().getSimpleName(), "process");
}
@Override
protected void done() {
try {
LinkedList<Stichwort> r = get();
log.entering(this.getClass().getSimpleName(), "done", r);
for (Stichwort stichwort : r) {
if(!model.contains(stichwort)){
model.addElement(stichwort);
}else {
log.fine("Already in Model: \""+stichwort+"\"");
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log.exiting(this.getClass().getSimpleName(), "done");
}
}
(Nicht über den extensiven gebrauch des Loggers wundern, ich verzweifel schon länger :? )
Zum StichwortListModel sei noch hinzugefügt, dass es sich um eine Klasse Handelt, die das DefaultListModel überschreibt und als Speicher eine LinkedList<Strichwort> benutzt.
soweit mein Problem, sieht Irgendwer eine Lösung?
MfG
Carsten
EDIT: Oder könnte das was mit der Sichtbarkeit des Models zu tun haben, das eine private Membervariable ist, und in einem anderen Paket steht (zusammen mit der JList) ??