Hi,
ich habe mit Netbeans eine Windows Desktopanwendung generiert. In der View-Klasse, dem sichtbaren Teil der Anwendung, ist ein Textfeld und ein Button. Der Button startet eine Prozedur, die von 1 bis 10 zählt und zwischendurch je 1 Sekunde wartet. Die Zahlen werden in dem Textfeld ausgegeben (textfeld.append()).
Wenn ich das ohne Schnickschnack programmiere, erscheint die Ausgabe 1..10 erst, wenn die Prozedur beendet ist und die "Kontrolle" wieder die View-Klasse hat.
Wie schicke ich die Prozedur in den Hintergrund (Swing, Runnable)?
Netbeans bietet da eine Lösung.
Hier der von Netbeans generierte Code der Prozedur, wenn man den Haken bei "Hintergrundaufgabe" setzt:
Soweit so gut.
1. Problem: Wenn man den Button bei 4 nochmal drückt, laufen zwei Tasks durcheinander ...
Ich möchte aber mit der Ausführung warten, bis der erste fertig ist. Es geht mir hier in erster Linie um die Ausgabe von Zwischenergebnissen im Textfeld, nicht um die Ausführung im Hintergrund.
2. Problem:
Ich möchte die Schleife parametrisieren, also beim Druck auf den Button soll die GUI der Prozedur einen Parameter für die Anzahl der Schleifendurchläufe mitgeben.
Der freundliche Hinweis von Netbeans
// Runs on the EDT. Copy GUI state that
// doInBackground() depends on from parameters
// to MachetTask fields, here.
soll mir wohl sagen, was zu tun ist, aber ich verstehe das nicht. Und das liegt nicht an meinen Englischkenntnissen. Wie kopiere ich Parameter in die Task-Fields? Und wie bzw. wo übergebe ich Parameter an MachetTask() ?
Vielen Dank für jede Hilfe!
Tschö,
Igor
ich habe mit Netbeans eine Windows Desktopanwendung generiert. In der View-Klasse, dem sichtbaren Teil der Anwendung, ist ein Textfeld und ein Button. Der Button startet eine Prozedur, die von 1 bis 10 zählt und zwischendurch je 1 Sekunde wartet. Die Zahlen werden in dem Textfeld ausgegeben (textfeld.append()).
Wenn ich das ohne Schnickschnack programmiere, erscheint die Ausgabe 1..10 erst, wenn die Prozedur beendet ist und die "Kontrolle" wieder die View-Klasse hat.
Wie schicke ich die Prozedur in den Hintergrund (Swing, Runnable)?
Netbeans bietet da eine Lösung.
Hier der von Netbeans generierte Code der Prozedur, wenn man den Haken bei "Hintergrundaufgabe" setzt:
Code:
/**
* Zählen und warten
*/
@Action public Task machet() {
return new MachetTask(org.jdesktop.application.Application.getInstance(machwas.MachwasApp.class));
}
private class MachetTask extends org.jdesktop.application.Task<Object, Void> {
MachetTask(org.jdesktop.application.Application app) {
// Runs on the EDT. Copy GUI state that
// doInBackground() depends on from parameters
// to MachetTask fields, here.
super(app);
}
@Override protected Object doInBackground() {
// Your Task's code here. This method runs
// on a background thread, so don't reference
// the Swing GUI from here.
for (int i=1;i<10;i++){
System.out.println("Zahl: " + i);
myView.setTextfeld("Zahl: "+ i + "\n");
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(MachwasApp.class.getName()).log(Level.SEVERE, null, ex);
}
}
return null; // return your result
}
@Override protected void succeeded(Object result) {
// Runs on the EDT. Update the GUI based on
// the result computed by doInBackground().
}
}
Soweit so gut.
1. Problem: Wenn man den Button bei 4 nochmal drückt, laufen zwei Tasks durcheinander ...
Ich möchte aber mit der Ausführung warten, bis der erste fertig ist. Es geht mir hier in erster Linie um die Ausgabe von Zwischenergebnissen im Textfeld, nicht um die Ausführung im Hintergrund.
2. Problem:
Ich möchte die Schleife parametrisieren, also beim Druck auf den Button soll die GUI der Prozedur einen Parameter für die Anzahl der Schleifendurchläufe mitgeben.
Der freundliche Hinweis von Netbeans
// Runs on the EDT. Copy GUI state that
// doInBackground() depends on from parameters
// to MachetTask fields, here.
soll mir wohl sagen, was zu tun ist, aber ich verstehe das nicht. Und das liegt nicht an meinen Englischkenntnissen. Wie kopiere ich Parameter in die Task-Fields? Und wie bzw. wo übergebe ich Parameter an MachetTask() ?
Vielen Dank für jede Hilfe!
Tschö,
Igor
Zuletzt bearbeitet: