Swing Gui auf Benutzerinteraktion prüfen

LiiKe

Mitglied
Guten Abend,
ich bin im Moment dabei ein Java Programm zu schreiben. Quasi ein Passwordmanagementesystem. Nun möchte ich sobald der Nutzer 5 Minuten lang nicht mit der Gui interagiert, dass das Fenster minimiert wird und man sich erneut einloggen muss. Wie ich die Parallelverarbeitung mache weiß ich, nur gibt es eine Möglichkeit zu prüfen ob der Nutzer irgendetwas in der GUI macht?

LG Nico
 
Die Frage finde ich etwas komisch. Gäbe es die Möglichkeit nicht, dann wäre ein Interface ja sinnlos oder? 😉
Mir persönlich wäre jetzt keine Klasse bekannt, welche explizit auf "Inaktivität" prüft.
Der erste Einfall wäre das einfach über die angemeldeten Listener zu lösen, die dir sagen, ob und wann ein User ein Event auslöst.
Das AWTEventListener Interface wäre ganz interessant, da du die Eventmaske, also auf welche Events reagiert wird, selbst bestimmen kannst. Meldest du den Listener an alle für dich wichtigen Components an, könntest du auf Inaktivität reagieren in dem du nach 5 Minuten selbst ein Event wirfst, bzw. den Timer bei Aktivität wieder resetest. Praktisch genau das selbe mit einem (Hintergrund)Thread.

Eine zweite Variante (ich kann nicht mal sagen ob die erste jetzt schön ist😉), vielleicht aber unschöne, wäre es, vor jeder Eingabe zu prüfen ob "die aktuelle Zeit" minus der "last Event Zeit" größer als 5 min ist und verweigerst dem User die Eingabe bis er sich neu anmeldet.

Und nicht vergessen mit invokeLater(); zu arbeiten, wenn du "manuell" an der GUI rumpfuschen willst.
 
Zuletzt bearbeitet:
Hallo,
erstmal danke für die Antwort, ja das war auch meine Idee das mit den Listenern zu lösen nur muss ich dort jeden Listener Prüfen.. also alle Key-,Action-,Mouse- usw.. Da diese sehr viele sind wollte ich das vermeiden. Ich denke da müsste es eine bessere variante geben...
 
Ich meine, dass du dir die Sachen vielleicht ansehen solltest, damit du abwägen kannst, ob da was für dich dabei ist. Kann dir ja nicht garantieren, dass du es magst bzw. das es die beste Lösung (für dich) ist, aber das musst du schon selber rausfinden. 😉


a) Prinzipiell würde es ja reichen, wenn du eine Methode hast, die den Aktualisierungsvorgang (also setze "Stoppuhr" auf 5 min nach der letzten Eingabe) beinhaltet. Die kannst du dann in deinen angemeldeten Action-, Keylistener,.... aufrufen. Der Aufwand hält sich für mich jetzt in Grenzen, da du die Listener ohne hin für deine Interaktionselemente implementierst und dort nur eine Zeile hinzufügst. 😉

b) Willst du jetzt zusätzlich zu den gebrauchten Listenern noch andere Events abfangen, dann könntest du dir das oben erwähnte AWTEventListener Interface ansehen, da du die abzufangenden Events bestimmen kannst. In deinem Fall hielte ich zumindest Variante a für vollkommen ausreichend.

1)Wenn du dich dann für eine Variante entschieden hast, kannst du die es entweder mit einem selber geworfenen Event umsetzen. Dazu schau dir mal javax.swing.Timer an, welche ein ActionEvent nach einer vorgegeben Verzögerung wirft. Beinhaltete u.a. die Methoden start(), stop() und restart(), also perfekt für dich.
2)Oder du arbeitest mit einem Thread der in einer Schleife wartet bzw. schläft und nach 5 Minuten die Schleifenbedingung auf false setzt, um danach seine Arbeit zu tun und bei der nächsten Anmeldung neu initialisiert wird.


just my two cents, die ich mit a) 1) am schönsten umgesetzt sehe.
 
Zuletzt bearbeitet:
Was spricht dagegen die EventQueue zu tauschen?
Java:
		 EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
	        eventQueue.push(new MyEventQueue());

Java:
private static class MyEventQueue extends EventQueue {
        public void postEvent(AWTEvent theEvent) {
            System.out.println("Event Posted"); // Ein Event!
            super.postEvent(theEvent);
        }
    }
Habe ich nicht probiert, wäre aber mein erster Ansatz.
 
Hallo,
ich habe beide Möglichkeiten ausprobiert. Funktioniert beides, wobei der EventQueue um einiges besser ist, da er auch events wie einen TabbedPane wechsel ohne extra Listener erkennt.
Vielen Dank euch beiden!
 

Zurück
Oben