![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Benutzer
Registriert seit: 05.12.2005
Beiträge: 62
|
Hallöchen nochmal...
ich habe eine UI, in der man u. a. eine Datei per JFileChooser auswählt. Wenn der Benutzer das macht, soll die ausgewählte Datei durchlaufen werden, um schonmal bestimmte Informationen anzuzeigen. Im Prinzip passiert hier nicht viel mehr als das Zählen der Zeilen dieser Textdatei. Was mich nur stört ist, dass diese Zählmethode die UI blockiert und diese erst wieder "freigibt", wenn zuende gezählt wurde (das Zählen könnte bis zu 10 Sek. dauern - große Dateien ^^). Ich hätte es aber nun gerne, dass diese Methode die UI nicht blockiert, so dass der Benutzer weitere Einstellungen auf der UI vornehmen kann, während im Hintergrund diese Datei durchgezählt wird. Erstmal ein paar wichtige Infos: FileSelector - kombiniert ein JTextField mit einem Browse-Button, der den JFileChooser aufruft. Besitzt ebenfalls ein optionales JLabel, um auf diesem irgendwelche Infos darzustellen. Dieses JLabel möchte ich dazu verwenden, dass der Benutzer mitbekommt, dass die selektierte Datei a) noch gezählt wird oder b) xyz Zeilen enthält. Das JLabel ist per Methode public JLabel getDescriptionLabel() zugreifbar. GeneCountThread - Zählt die Zeilen der Datei, die Genexpressionsprofile definieren. Hab mir schon gedacht, dass man das in einen eigenen Thread packen muss, damit es nebenher läuft, aber ich bin Thread-Noob ^^ und irgendwas mach ich hier falsch. Code-Auszug: Code:
public class GeneCountThread implements Runnable {
//...
public GeneCountThread(File f, JLabel display) { //Die Datei und das JLabel des FileSelectors
//...
}
public void run() {
genes = 0;
try {
StanfordReader sp = new StanfordReader(f);
Gene g = sp.readGene();
while(g!=null) {
genes++;
//das JLabel 'display' soll nicht für jedes einzeln gezählte Gen aktualisiert werden
if(genes%10==0) this.display.setText(genes+" genes. Still counting...");
//ein Thread.sleep() scheint hier auch nicht viel zu bringen
g = sp.readGene();
}
sp.close();
// während des Zählens hat das JLabel rote Schrift.
// Wenn fertig gezählt wurde, soll Schrift schwarz sein
this.display.setForeground(Color.BLACK);
this.display.setText("File contains "+genes+" genes");
}
catch(Exception e) {
// ...
}
}
}
Hoffe es gibt da was, was mir meine Architektur nicht über den Haufen wirft ^^ Thx in advance sayang |
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 28.08.2004
Ort: konstanz am bodensee
Beiträge: 190
|
die endscheidenden zeilen code hast du nicht gepostet, aber ich vermute das du die run methode von GeneCountThread direkt aufrufst.
Code:
GeneCountThread t = new GeneCountThread(); t.run(); Klassen die Runnable implementieren sind noch keine threads, sie können von threads aufgerufen werden. entwerder du änders die klasse GeneCountThread um, das sie Thread erweitert, oder du änderst den aufrufenden code, dann solltest du GeneCountThread in GeneCountRunnable umbenennen. Code:
Runnable run = new GeneCountThread(); Thread thread = new Thread(run); thread.start(); |
|
|
|
|
|
Nach oben #3 |
|
Benutzer
Registriert seit: 05.12.2005
Beiträge: 62
|
Perfekt... manchmal sind die einfachsten Fehler doch diejenigen, auf die man einfach nicht kommt ^^
dankeschön... sayang PS: kann man hier die Themen eigentlich auch als erledigt markieren? ich hab sone option jedenfalls noch nicht gefunden... vll. bin ich hier ja auch so blind wie bei meinem problem ^^ |
|
|
|
|
|
Nach oben #4 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
|
Zitat:
Aber gut, dass Du es angemerkt hast, dann muss ich mich da langsam mal mit beschäftigen Diskussion dazu kann bei Bedarf und Interesse hier fortgeführt werden. |
|
|
|
|
|
|
Nach oben #5 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Sei froh, dass es das nicht gibt...
Dein Problem fängt nämlich gerade erst an. Du darfst nicht aus einem anderen Thread auf Swing-Komponenten zugreifen. d.h. aus: Code:
if(genes%10==0) this.display.setText(genes+" genes. Still counting..."); Code:
if(genes%10==0) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
this.display.setText(genes+" genes. Still counting...");
}
});
}
Als kleinen Tipp möchte ich zwei Namen in den Raum werfen, die du ergooglen könntest: Foxtrot und SwingWorker. |
|
|
|
|
|
Nach oben #8 | |
|
Erfahrener Benutzer
Registriert seit: 02.02.2005
Beiträge: 515
|
Zitat:
Was die Begründung angeht dürfte Ben gar nicht ma so falsch liegen |
|
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Statische unbekannte Methode aufrufen | bobby | PHP-Programmierung | 6 | 17.03.2007 17:58 |
| PHPeclipse - herausfinden, wo eine Methode aufgerufen wird | Ben | Eclipse | 3 | 12.03.2006 22:46 |
| statische Methode per Reflection aufrufen | ehli75 | Allgemeine Java-Programmierung | 2 | 02.02.2006 13:17 |
| Methode in der main aufrufen, unterschied JApplet und JFrame | Gottzilla | Desktop-Applikationen und Grafik | 3 | 10.03.2005 10:12 |
| Clone Methode treibt mich zum Wahnsinn | pro_evo | Allgemeine Java-Programmierung | 7 | 23.01.2005 08:34 |