Event Handling

flosparrow

Mitglied
Hey,
ich bin gerade dabei ein kleines Programm zuschreiben, was auf zwei events, in dem fall keyevents gleichzeitig reagieren soll. Leider schaff ich es nur, das ein event nach dem anderem abgearbeitet wird. Auch wenn ich den folgenden methodenaufruf in einem neuem Thread starte.
Praktisch sieht das ganze dann so aus:
Drückst man auf eine Taste auf die reagiert werden soll funktioniert das ganze. Drückt man jezt zusätzlich noch eine zweite, wird nur noch das event der zweiten taste ausgeführt.
Kann mir da jemand helfen, wie ich das geschickt implementieren könnte?
 
hier noch kurz ein Quellcode ausschnitt, damit ihr seht, nach welchem prinziep ich das bisher implementiert hab:

Java:
public class Test implements KeyListener{
    public void keyPressed(KeyEvent e) {
        figur f = new figur();
        int ID = e.getKeyCode();
        try{
            figur.do();
            Thread t0 = new Thread(f);
            t0.start();
        }catch(IllegalThreadStateException ex{}
    }
}

public class figur implements Runnable{
    @Override
    public void run() {
        bewege();
    }
}
 
Evt. den ersten Thread von Zeit zu Zeit schlafen legen, sodass auch andere (dein zweiter) Thread arbeiten können. Wobei die Methoden-Aufrufe ja schon sehr Aufwendig sein müssen um merkbar den zweiten Thread warten zu lassen.

-Luk10-
 
Gleichzeitig mehrere KeyEvents empfangen geht hardwarebedingt nicht. Manche Tasten auf der Tastatur werden vom gleichen Bus abgefragt, weshalb die Signale nicht gleichzeitig gesendet werden können.

Du wirst nicht drumherum kommen, als die Events zu speichern: Sobald eine Taste gedrückt ist, diese einer Liste hinzufügen - wenn sie wieder losgelassen wird muss sie dann wieder daraus entfernt werden.
 
Drückt man jezt zusätzlich noch eine zweite, wird nur noch das event der zweiten taste ausgeführt.

Welche 2 Tasten drueckst du den? Die Action-, Modifierkeys werden eventuell mit andern keys zusammengelegt und als 1 Event. Aus deiner Beschreibung ist nicht ersichtlich ob der Event nicht ausgeloest oder es sich um ein Multithreading problem handelt.

Zur Info:
Alle AWT/Swing Events werden im EventDispatcherThread (The Event Dispatch Thread (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)) sequenziel ausgefuehrt. Somit werden die KeyEvents niemals parallel verarbeitet. Du kannst aber den Code in einen Thread auslagern und starten, ab diesem Zeitpunkt laeuft die Verarbeitung wieder parallel. Es ist aber zu beachten, das saemptliche Veraenderung am AWT/Swing Komponenten, bzw die paint()-Methode wieder im EDT ausgefuehrt werden muss (siehe SwingWorker)
 
@luk10: nein. Der Aufwand des ersten Threads@ist nicht das problem. Bzw. ich glaube es nicht. Letztendlich soll sich entwas bewegen, wenn man auf eine der Pfeiltasten drückt. Bis dato kein Problem. Auch ist es möglich, das sich etwas zweites bewegt, wenn man die "W"-Tste drückt. Drückt man allerdings erst die Peil-Taste und hält diese gedrückt, bewegt sich das erste Objekt regelmäßig. Drücktman jetzt die W-Taste zusätzlich wird nur noch die bewegung des zweiten objekts wargenommen.

@Antoras: Danke. Echt gute Idee. Du meinst wahrscheinlich, dass man diese Liste dann immer wieder durchläuft und für jedes Event drin einen Thread erzeugt. Find ich echt gut. Ich werde es mal ausprobieren.

@tagedieb: So wie's aussieht handelt es sich um ein Problem mit dem Event Handling so wie Antoras geschrieben hat. Weil der zweite Thread ja auf jeden fall ausgeführt wird. Nur der erste dann nichtmehr.
Vielleicht liegt es aber auch an meiner Thread geschichte. Danke auch für deinen Tipp, aber soviel ich das verstanden habe, habe ich das ja schon gemacht.

Ganz generell bleibt für mich die Frage, wie man das normalerweise regelt. Es gibt ja doch relativ viele Programme, die "gleichzeitig" auf den Anschlag zweier oder noch mehr Tasten reagieren können.
 
Du hast doch sicher eine Game loop. Mach dir 4 boolean Variablen rauf,runter,links,rechts und frag die in der loop ab. Ist eine z.B rauf true, bewegst du dein Männchen nach oben usw.
Im keylistener setzt du einfach die jeweilige Variable auf true bei pressed und false bei released.
 

Zurück
Oben