SWING applikation soll events selbst abholen



  • Hallo zusammen. Ich habe leider in der F.A.Q. und mit der suchfunktion nichts entsprechendes finden können, deshalb wende ich mich an euch, in der hoffnung, dass jemand einen tip für mich hat.
    Ich entwickle gerade für die uni eine SWING-anwendung, bei der es nötig ist in einer endlosschleife daten zu verarbeiten. Sobald das program jedoch in die endlosschleife eintritt, empfängt die Applikation keine events mehr. wie kann ich meine applikation in der endlosschleife dazu zwingen, nachzuschauen, ob neue events vorliegen und diese zu verarbeiten? (pendant zu PeekMessage(...) in c++)

    beispiel

    public void theLoopMethod() {
        while(true) {
            myModule.processData();
            // und hier würde ich jetzt gerne eine methode aufrufen,
            // die schaut, ob ein event vorliegt und den entspr. Listener aufruft
        }
    }
    

    diese struktur kann ich leider nicht umgehen, da die applikation mithilfe interner events mit einem modul kommuniziert, das streng von swing weggekapselt sein muss. die endlosschleife soll dann mit solch einem internen event verlassen werden.

    vielen dank an alle, die sich die zeit nehmen, um mir zu helfen.



  • wie wärs mit einem timer, der immer auf neue actionevents hört?
    http://www.dpunkt.de/java/Programmieren_mit_Java/Oberflaechenprogrammierung/66.html



  • hm, möglicherweise verstehe ich dich falsch, aber ich denke, dass hilft mir nicht weiter. es geht mir an dieser stelle nicht darum, periodisch etwas aufzurufen, sondern die anwendung dazu zu zwingen ihren event stack abzufragen (wie halt eben unter c++ mit PeekMessage()). ich muss das möglichst zeitnah machen, damit es nicht zu hängern kommt.
    meine event listener hab ich ja alle schon längst implementiert und die funktionieren auch wunderbar. nur sobald die anwendung in diesen main loop eintritt kommt das system nicht mehr dazu, seine events zu überprüfen (ist ja auch logisch). und da man unter SWING auf den "echten" mainloop, wie es ihn z.b. in hand geschriebenen windows applikationen gibt, keinen zugriff hat (zumindest weis ich nicht, wie man dran kommt) muss ich mir diesen main loop halt selbst basteln. ist auch nicht besonders schlimm, nur fehlt mir leider das wissen, wie man manuell events abholt. das macht swing im normalfall ja immer selbst und der programmierer merkt gar nichts davon.

    😞



  • nach einer weile wühlen habe ich jetzt einen möglichen lösungsansatz:

    private void theLoopMethod() {
    	java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit();
    	while(true) {
    		myModule.processData();
    		try {
    			windowFrame.dispatchEvent(
    					tk.getSystemEventQueue().getNextEvent());
    		} catch(Throwable e) {
    			System.out.println("Fehler");
    		}
    	}
    }
    

    dieser code führt dazu, dass das fenster immerhin mitbekommt, wenn es geschlossen wird und die anwendung beendet. jegliche andere events werden leider nicht verarbeitet und das fenster wird nicht einmal mehr neugezeichnet, sprich "friert" komplett ein. da aber alle events die ich verarbeite kinder von AWTEvent sind (in diesem fall nur ActionEvent und KeyEvent), verstehe ich nicht ganz, warum windowFrame.dispatchEvent(AWTEvent event) diese events nicht korrekt an seine kinder weiterleitet (was es laut javadoc tun sollte).
    es wäre toll, wenn jemand mir helfen kann.

    gruß & vielen dank



  • Wie wäre es mit nebenläufiger Programmierung - also mit Threads? Wenn du die Schleife in einen Thread auslagerst, wird die GUI nicht blockiert.





  • Der SwingWorker ist letztendlich nix anderes als nebenläufige Programmierung: nur das man sich das manuelle dispatchen der return values in den EDT spart und man eine simple und funktionale API benutzt.


Anmelden zum Antworten