PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - Wie einer Klasse mitteilen, dass "ich" fertig bin?


Gast
2008-07-02, 18:35:16
Hi!

Ich habe ein kleines Java-Programm, das mit einem Start-Button die Methode einer Klasse aufruft.
Während die Methode verarbeitet wird, soll der Start-Button deaktiviert werden. Ist die Methode fertig, dann soll der Button wieder aktiviert werden.

Wenn ich das aber so löse

...actionPerformed(...)...
{
button.setEnabled( false );
objekt.methode(); // Verarbeitungszeit ~2 Sekunden
button.setEnabled( true );
}

dann bleibt der Button aber aktiviert und ich weiss leider nicht, wieso das so ist.

Kann ich der aufrufenden Klasse in 'objekt.methode' am Ende irgendwie mitteilen, dass ich nun fertig bin?

Ich hatte mir schon überlegt, einen unsichtbaren Button zu machen und diesen in der objekt.methode mit doClick() automatisch zu klicken und in der aufrufenden Klasse das Ereignis zu verarbeiten. Allerdings kommt mir das als Java-Anfänger schon reichlich unprofessionell vor...

Gast
2008-07-02, 18:44:36
Vermutung: Vllt dauert die Verarbeitung der Methode doch nicht so lange und du siehst das Sperren des Buttons nur nicht.

del_4901
2008-07-02, 18:47:40
http://de.wikipedia.org/wiki/Beobachter_(Entwurfsmuster)

Monger
2008-07-02, 19:06:22
Das Problem ist, dass in einer Single-Threaded Architektur du IMMER darauf wartest dass irgendwas fertig wird.

In deinem Fall ist es z.B. so, dass er nichtmal dazu kommt, den Button tatsächlich auf inaktiv zu setzen, weil er ja erst die Methode bearbeiten muss. Erst nachdem deine Methode abgearbeitet wurde, werden die beiden Ereignisse verarbeitet die du ausgelöst hast - nämlich erst den Button zu deaktivieren, und direkt anschließend wieder zu aktivieren. Das geht natürlich so schnell (bzw. dazwischen kommt vermutlich nichtmal ein Repaint), so dass du von dieser Aktion überhaupt nichts mitkriegst. Wenn du die letzte Zeile mal auskommentierst, wird dein Button in dem Moment inaktiv sobald die Methode durchgelaufen ist und deine Oberfläche wieder reagiert.

Wir bewegen uns hier also jetzt im zutiefst hässlichen Bereich der asynchronen Vorgänge.

Mein Tipp: wenn deine Operation wirklich nur zwei Sekunden dauert, dann belass es dabei. Dass die Anwendung mal für kurze Zeit nicht reagiert, ist der Anwender auch von anderen Programmen gewohnt. Du könntest aber z.B. den Mauszeiger wenigstens zu einer Sanduhr ändern, damit der Anwender wenigstens ein bißchen Feedback bekommt.

Sollte aber eine Funktion wirklich lange dauern, wirst du dich wohl oder übel mit dem SwingWorker (http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html) beschäftigen müssen. Der sorgt dafür, dass sowohl dein rechenintensiver Code als auch die Oberfläche parallel zueinander werkeln können.

Siehe auch Wikipedia (http://en.wikipedia.org/wiki/SwingWorker)

Gast
2008-07-03, 11:47:05
Ich würde object.methode() einfach in einem neuen Thread laufen lassen, der dann wenn er fertig ist, per Callback den Start-Knopf wieder aktiviert.

Monger
2008-07-03, 12:51:30
Ich würde object.methode() einfach in einem neuen Thread laufen lassen, der dann wenn er fertig ist, per Callback den Start-Knopf wieder aktiviert.

Events dürfen - so ohne weiteres - nicht aus einem fremden Thread an die Oberfläche geschickt werden. Das geht nur über Umwege. Sich selbst sowas zu basteln ist nicht ganz einfach. Deshalb gibt es nunmal für genau solche Aufgaben den SwingWorker.

Pinoccio
2008-07-03, 13:22:00
Eine Variante wäre, objekt.methode() einen rückgabewert zuzuweisen und in eine Variable zu schreiben. Dann sollte das Programm an der Stelle solange warten bis dieser kommt und dann weitermachen.

mfg