Verständnisproblem bei Fensteraktualisierung

ich_Schmiddy

Mitglied
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();

}};
//====================
 
Hallo!

Wahrscheinlich machst du deine Berechnungen im GUI Threat der dadurch so lange aufgehalten wird, bis die Berechnung beendet ist. Erst dann kann sich die GUI wieder aktualisieren.

Versuch mal "um deine Berechnung herum" folgendes:

Code:
...
SwingUtilities.invokeLater(new Runnable(){
   public void run(){
     // hier kommt deine Berechnung....
   }
 }
);
...

Gruß Tom
 

Neue Beiträge

Zurück