ces Geschrieben 12. April 2010 Geschrieben 12. April 2010 Hallo zusammen, ich muss mich nun doch wieder an Euch wenden, weil ich wirklich nicht weiter weiss. Ich habe ein Programm erstellt welches durch unterschiedliche Buttons ein Onlinemessgerät konfiguriert und verwaltet. Nun möchte ich dass wenn ein Button gedrückt wurde, dass die anderen nicht verwendet werden können für ca 10 Sekunden (länge jedes Buttons zum konfiguerieren) Ich habe es nun so versucht. Beispiel eines Buttons: this.ButtonStandard.setEnabled(false); this.ButtonFine.setEnabled(false); this.ButtonSwitchOutput.setEnabled(false); this.ButtonMinMax.setEnabled(false); this.ButtonGetConfigFile.setEnabled(false); this.ButtonGetFiles.setEnabled(false); this.ButtonDeleteMeassurement.setEnabled(false); this.ButtonFirmware.setEnabled(false); this.ButtonGetFtpFile.setEnabled(false); this.ButtonSetFtpFile.setEnabled(false); this.ButtonStandard.paintImmediately(0, 0, 500, 600); this.ButtonFine.paintImmediately(0, 0, 500, 600); this.ButtonSwitchOutput.paintImmediately(0, 0, 500, 600); this.ButtonMinMax.paintImmediately(0, 0, 500, 600); this.ButtonGetConfigFile.paintImmediately(0, 0, 500, 600); this.ButtonGetFiles.paintImmediately(0, 0, 500, 600); this.ButtonDeleteMeassurement.paintImmediately(0, 0, 500, 600); this.ButtonFirmware.paintImmediately(0, 0, 500, 600); this.ButtonGetFtpFile.paintImmediately(0, 0, 500, 600); this.ButtonGetFtpFile.paintImmediately(0, 0, 500, 600); try { Thread.sleep(10000); } catch (InterruptedException e) { System.out.println("geht nicht"); } this.ButtonStandard.setEnabled(true); this.ButtonFine.setEnabled(true); this.ButtonSwitchOutput.setEnabled(true); this.ButtonMinMax.setEnabled(true); this.ButtonGetConfigFile.setEnabled(true); this.ButtonGetFiles.setEnabled(true); this.ButtonDeleteMeassurement.setEnabled(true); this.ButtonFirmware.setEnabled(true); this.ButtonGetFtpFile.setEnabled(true); this.ButtonSetFtpFile.setEnabled(true); } Dies Funktioniert auch soweit. Die Anwendung steht 10 Sekunden und die Buttons sind ausgegraut und werden danach wieder angezeigt. So soll es auch sein, was mich nun stört ist: Wenn die Buttons ausgegraut sind und ich trotzdem auf einen oder zwei Buttons drücke (Buttons sind ausgegraut) dann werden diese sofort gestartet wenn die Buttons wieder enabled sind und dass darf einfach nicht sein. Viele Danke schonmal im Voraus Zitieren
flashpixx Geschrieben 12. April 2010 Geschrieben 12. April 2010 Verwende bitte Code-Tags! @Topic: Das ist klar, Du "pausierst" Deine Anwendung, d.h. alle Aktionen werden auch pausiert und nicht "verworfen". Ich würde aber generell die Anwendung nicht anhalten, sondern nur die Aktionen der Buttons unterbinden, d.h. der Ansatz ist in den Listener der Buttons. Pausierende Anwendungen sind sehr "unschön in der Bedienung" Zitieren
ces Geschrieben 12. April 2010 Autor Geschrieben 12. April 2010 Und wie meinst du das ? Ich steht grad komplett aufn Schlauch Zitieren
flashpixx Geschrieben 12. April 2010 Geschrieben 12. April 2010 Du willst ja, dass die Aktionen während einer gewissen Zeit nicht statt finden, d.h. Du darfst den Code im Listener nicht ausführen. Im Moment "friest" Du nur die Anwendung ein. D.h. ein Button wird geklickt, dann wird ein Timer gestartet, der eben eine gewisse Zeit läuft, während der Timer läuft darf der Code im Listener nicht ausgeführt werden (anders: ist der Timer aktiv, darf der Listener nichts machen). Zitieren
speedi Geschrieben 12. April 2010 Geschrieben 12. April 2010 (bearbeitet) new Thread(){ public void run(){ DeineHauptKlasse.this.ButtonStandard.setEnabled(false); DeineHauptKlasse.this.ButtonFine.setEnabled(false); DeineHauptKlasse.this.ButtonSwitchOutput.setEnabled(false); DeineHauptKlasse.this.ButtonMinMax.setEnabled(false); DeineHauptKlasse.this.ButtonGetConfigFile.setEnabled(false); DeineHauptKlasse.this.ButtonGetFiles.setEnabled(false); DeineHauptKlasse.this.ButtonDeleteMeassurement.setEnabled(false); DeineHauptKlasse.this.ButtonFirmware.setEnabled(false); DeineHauptKlasse.this.ButtonGetFtpFile.setEnabled(false); DeineHauptKlasse.this.ButtonSetFtpFile.setEnabled(false); DeineHauptKlasse.this.ButtonStandard.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonFine.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonSwitchOutput.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonMinMax.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonGetConfigFile.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonGetFiles.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonDeleteMeassurement.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonFirmware.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonGetFtpFile.paintImmediately(0, 0, 500, 600); DeineHauptKlasse.this.ButtonGetFtpFile.paintImmediately(0, 0, 500, 600); try { Thread.sleep(10000); } catch (InterruptedException e) { System.out.println("geht nicht"); } DeineHauptKlasse.this.ButtonStandard.setEnabled(true); DeineHauptKlasse.this.ButtonFine.setEnabled(true); DeineHauptKlasse.this.ButtonSwitchOutput.setEnabled(true); DeineHauptKlasse.this.ButtonMinMax.setEnabled(true); DeineHauptKlasse.this.ButtonGetConfigFile.setEnabled(true); DeineHauptKlasse.this.ButtonGetFiles.setEnabled(true); DeineHauptKlasse.this.ButtonDeleteMeassurement.setEnabled(true); DeineHauptKlasse.this.ButtonFirmware.setEnabled(true); DeineHauptKlasse.this.ButtonGetFtpFile.setEnabled(true); DeineHauptKlasse.this.ButtonSetFtpFile.setEnabled(true); } } }.start(); Wenn du Thread.sleep einfach so direkt im ActionListener rufst legst du den gesamten GUI-Thread schlafen. Das musst du einfach nur parallelisieren, dann hauts hin. Ob du das direkt über einen Thread oder über einen Timer machst ist am Ende Jacke wie Hose. Übrigens: Klassen-Variablen werden klein geschrieben. Neue Wörter in der Variable beginnen mit einem großbuchstaben (z.B. "buttonForClosingTheApplication"). Bearbeitet 12. April 2010 von speedi Zitieren
flashpixx Geschrieben 14. April 2010 Geschrieben 14. April 2010 (bearbeitet) Das musst du einfach nur parallelisieren, dann hauts hin. Ob du das direkt über einen Thread oder über einen Timer machst ist am Ende Jacke wie Hose. Ich denke das wird nicht so funktionieren, denn wenn der Thread schläft und der Button geklickt wird, dann wird nachdem der Button wieder aktiv ist, die Aktion des Listeners trotzdem ausgeführt. Man unterbindet ja mit einem sleep nicht die Abarbeitung. Ich würde einen Thread bevor ein paralleler Thread schläft eine synchronisierte und final Boolvariable entsprechend setzen und diese innerhalb des Button-Listeners abfragen. Zusätzlich wäre es dann auch sinnvoll eine Statusnachricht einzubauen, die dem User mitteilt, dass gerade gearbeitet wird. Buttons einfach an- und ausschalten finde ich nicht besonders benutzerfreundlich, ich würde einfach die Aktion des Listeners mit einem Dialog abfangen Bearbeitet 14. April 2010 von flashpixx Zitieren
speedi Geschrieben 14. April 2010 Geschrieben 14. April 2010 Ich denke das wird nicht so funktionieren, denn wenn der Thread schläft und der Button geklickt wird, dann wird nachdem der Button wieder aktiv ist, die Aktion des Listeners trotzdem ausgeführt. Man unterbindet ja mit einem sleep nicht die Abarbeitung. So wie ich es geschrieben habe würde es funktionieren. Du legst ja nicht die GUI schlafen sondern erstellst einen neuen Thread der zuersteinmal die Buttons abschaltet dann schläft(nur dieser eine Thread schläft! - alle anderen natürlich nicht) und dann die Buttons wieder anschaltet. Wenn du auf einen deaktivierten Button klickst werden seine ActionListener natürlich nicht gerufen, aber der klick wird natürlich verarbeitet, da die GUI eben nicht schläft. Ich würde einen Thread bevor ein paralleler Thread schläft eine synchronisierte und final Boolvariable entsprechend setzen und diese innerhalb des Button-Listeners abfragen. Zusätzlich wäre es dann auch sinnvoll eine Statusnachricht einzubauen, die dem User mitteilt, dass gerade gearbeitet wird. Wenn der Grund wieso teile der GUI disabled sind nicht ersichtlich ist wäre das sicher eine sinnvolle Sache. Allerdings darf man dann die Buttons nicht mit setEnabled(boolean bearbeiten, da nütlich ausgeschaltete Buttons ihre ActionListener nicht mehr rufen - d.h. man müsste sich was einfallen lassen, damit der User nicht erst beim clicken merkt, dass sein vorhaben nicht möglich ist (z.B. manuelles setzen der Farbe). Zitieren
ces Geschrieben 14. April 2010 Autor Geschrieben 14. April 2010 Hi ich habs jetzt anders gemacht. ich hab nen Dialog modal hochgepoppt und nach 10 sekunden dann disposed nicht schön aber es funktioniert ... danke nochmals für die coolen tipps Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.