Hey...
mir ist grad mehr durch Zufall etwas aufgefallen, worüber ich einfach mal sagen würde, es ist
ne Race Condition (tritt manchmal auf, manchmal nicht).
Um was geht's:
Ich habe eine JList und ein JListModel. Das Model verändere ich während der Laufzeit, ich füge
Nachrichten hinzu (das Model ist eine Art Logger).
Das tue ich mittels
Klappt auch soweit, die JList ist an ein JFrame gekoppelt und zeigt diese Nachrichten dann an.
Nur wenn ich ganz schnell hintereinander zweimal diese say()-Methode aufrufe, passiert es manchmal (!),
dass der komplette Fensterinhalt, also alle Log-Nachrichten, verschwinden -> das Fenster (die Liste??) ist leer...
Ich kann mir das überhaupt nicht erklären, scheinbar ist ihm das einfach "zu schnell".
Ich habe alle Methoden, die meiner Meinung nach mit diesem ganzen Observern-Pattern zu tun haben,
mit dem Schlüsselwort synchronized versehen -> Kein Effekt
Ich glaube ich kann es euch nicht ersparen, diesen Teil meines Programms zu posten...
An der JList selbst hab ich nix gemacht, is ne ganz stinknormale new JList(), die eben als Model
mein LogListModel bekommen hat... Keine Ahnung, warum dieser Effekt manchmal auftritt.
Wie gesagt nur, wenn ich zwei mal sofort hintereinander mittels Log.say() etwas logge...
Was vllt auch noch eine hilfreiche Info sein könnte: Die JList wiederum liegt auf einem JScrollPane, das in
das Fenster gelegt wurde:
Hat jemand eine Idee, was da los ist? ???:L
mir ist grad mehr durch Zufall etwas aufgefallen, worüber ich einfach mal sagen würde, es ist
ne Race Condition (tritt manchmal auf, manchmal nicht).
Um was geht's:
Ich habe eine JList und ein JListModel. Das Model verändere ich während der Laufzeit, ich füge
Nachrichten hinzu (das Model ist eine Art Logger).
Das tue ich mittels
Code:
Log.say("Meine Nachricht"); // Log ist dieses Model (extends DefaultListModel)
Klappt auch soweit, die JList ist an ein JFrame gekoppelt und zeigt diese Nachrichten dann an.
Nur wenn ich ganz schnell hintereinander zweimal diese say()-Methode aufrufe, passiert es manchmal (!),
dass der komplette Fensterinhalt, also alle Log-Nachrichten, verschwinden -> das Fenster (die Liste??) ist leer...
Ich kann mir das überhaupt nicht erklären, scheinbar ist ihm das einfach "zu schnell".
Ich habe alle Methoden, die meiner Meinung nach mit diesem ganzen Observern-Pattern zu tun haben,
mit dem Schlüsselwort synchronized versehen -> Kein Effekt
Ich glaube ich kann es euch nicht ersparen, diesen Teil meines Programms zu posten...
Code:
public class Log {
private static LogListModel model = new LogListModel(new LogConsole());
public static synchronized void say(String message) {
model.addElement(message);
}
}
Code:
public class LogListModel extends DefaultListModel {
private ArrayList<LogEntry> entries;
private LogConsole myConsole;
public LogListModel(LogConsole console) {
entries = new ArrayList<LogEntry>();
myConsole = console; // das ist einfach das JFrame indem alles angezeigt wird.
myConsole.getList().setModel(this); // hier wird der JList eben dieses Model übergeben!
myConsole.setVisible(true);
}
@Override
public synchronized Object getElementAt(int index) {
return entries.get(index).getMessage();
}
public synchronized String getMoreFrom(int index) {
return entries.get(index).getMore();
}
@Override
public synchronized void addElement(Object o) {
super.addElement(entries.add(new LogEntry((String) o)));
}
}
An der JList selbst hab ich nix gemacht, is ne ganz stinknormale new JList(), die eben als Model
mein LogListModel bekommen hat... Keine Ahnung, warum dieser Effekt manchmal auftritt.
Wie gesagt nur, wenn ich zwei mal sofort hintereinander mittels Log.say() etwas logge...
Was vllt auch noch eine hilfreiche Info sein könnte: Die JList wiederum liegt auf einem JScrollPane, das in
das Fenster gelegt wurde:
Code:
public class LogConsole extends JFrame {
private JList list;
private JScrollPane pane;
public LogConsole() {
list = new LogConsoleList();
pane = new LogConsoleScrollPane(list);
getContentPane().add(pane);
pack();
}
// ...
}
Hat jemand eine Idee, was da los ist? ???:L