Chris: Problem mit Fensteraktualisierung

Verständnisproblem bei Fensteraktualisierung
Hallo!

Ich habe da ein kleines Problem:

Ich habe eine Klasse geschrieben, die eine Berechnung durchführt. Diese Klasse öffnet ein Fenster, in dem steht wie lange die Berechnung noch dauert. Die Anzeige wird während der Berechnung immer wieder aktualisiert. So weit klappt es perfekt!

Jetzt habe ich aber ein Hauptprogramm, aus dem man diese Berechnung aufrufen soll. Wenn ich im Hauptprogramm einen Knopf mache, mit dem man die Berechnung aufruft und sie folgendermaßen aufrufe

======
(...)
Berechnung B = new Berechnung();
B.rechne();
(...)

funktioniert die Berechnung auch perfekt, aber das Fenster, daß die verbleibende Zeit anzeigt, wird nur geöffnet, aber ohne Inhalt. Der Inhalt wird erst nach Ende der Berechnung aktualisiert.

D.h. die Klasse allein tut mit Fensteraktualisierung, aus einem anderen Fenster aufgerufen aber nicht. Kann mir das jemand erklären?

Ich vermute (befürchte) es hat mit Threads zu tun, aber kann man das irgendwie beheben? Ich habe sogar schonmal das Hauptfenster geschlossen bevor die Berechnung aufgerufen wurde, hat auch nix gebracht.

//====================
Diese Berechnung ist es, in einer eigenen Klasse aufgerufen tut das Fenster
//====================
static public Vector Blast()
{
ls_tools Tools = new ls_tools();
Vector vec = new Vector();
String id = "";
int time = 0;

try
{
URL url = new URL("http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?QUERY=aaggttcc&DATABASE=nr&HITLIST_SIZE=10&FILTER=L&EXPECT=10&FORMAT_TYPE=HTML&PROGRAM=blastn&CLIENT=web&SERVICE=plain&NCBI_GI=on&PAGE=Nucleotides&CMD=Put");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
String temp = br.readLine();

while(temp != null)
{
if(temp.indexOf("RID =") != -1)
{
id = temp.substring(temp.indexOf("RID =") + 6);
}

if(temp.indexOf("RTOE =") != -1)
{
time = Integer.parseInt(temp.substring(temp.indexOf("RTOE =") + 7));
}
System.err.println(temp);
temp = br.readLine();
}

boolean warten = true;

JFrame jf = new JFrame("Wartezeit: " + time + "s");
JTextArea jta = new JTextArea();
jf.setSize(800,300);
jf.getContentPane().add(jta);
Tools.Zentrieren(jf);
jf.setVisible(true);
jf.show();

Date alt = new Date();
long milli = alt.getTime();
Date neu = new Date(milli+time*1000);

String text = "Wartezeit: " + time + "s, Aktuelle Zeit: " + alt.toString() + "fertig: " + neu.toString();
jta.setText(text);

while(warten)
{
warten = false;

Thread.sleep(time*1000);

System.err.println("warte" + time);

url = new URL("http://www.ncbi.nlm.nih.gov/blast/Blast.cgi?CMD=Get&RID=" + id + "&FORMAT_OBJECT=Alignment&FORMAT_TYPE=HTML&DESCRIPTIONS=100&ALIGNMENTS=200&ALIGNMENT_TYPE=Pairwise&OVERVIEW=yes");
br = new BufferedReader(new InputStreamReader(url.openStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("blasttest.htm"));
temp = br.readLine();

while(temp != null)
{
System.err.println(temp);
bw.write(temp + "\n");

if(temp.indexOf("Status=WAITING") != -1)
{
warten = true;
alt = new Date();
milli = alt.getTime();
neu = new Date(milli+time*1000);

text = text + "\n\nUpdate\nWartezeit: " + time + "s, Aktuelle Zeit: " + alt.toString() + "fertig: " + neu.toString();
jta.setText(text);

}
temp = br.readLine();
}
bw.close();
}
jf.dispose();
}
catch(Exception e){e.printStackTrace();}

System.out.println(id);
System.out.println(time);

return vec;
}

//====================
//====================
Und so habe ich es im ActionListener des Hauptproggis aufgerufen,
die Klasse in der sich die Methode befindet heißt "ls_sequenzanalyse"
//====================
ActionListener StartListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
ls_sequenzanalyse lss = new ls_sequenzanalyse();
lss.Blast();

}};
//====================

  1. Hallo,

    so wie sich das liest, läßt du die Berechnung im Event-Dispatch-Thread
    laufen, was jede andere Event-Verarbeitung (wozu auch "Neu zeichnen"
    gehört) solange blockiert.
    Ich habe zum Event-Dispatch-Thread mal was geschrieben:
    http://forum.de.selfhtml.org/archiv/2003/12/67804/#m388278

    Wahrscheinlich hilft dir der Thread schon weiter.

    Ansonsten such in Google einfach mal nach "event dispatch thread". Dort
    findest du auch einige Seiten zum Thema.

    Gruß
    Slyh