Zum Inhalt springen

Buttons in Java


ces

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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"

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von speedi
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von flashpixx
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 B) 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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...