PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java, Swing, Verlust des Fokus


Sliver21
2007-06-07, 16:58:57
Hallo Jungs,
wir programmieren gerade ein Spiel. Mittlerweile sind wir schon in der Endphase. Wir sind schon in der Lage das Spiel direkt zu starten, also:

Spiel unserSpiel = new Spiel();

Nachdem man das aufruft startet das Spiel. Ein Frame wird erzeugt, die Keylistener werden angemeldet usw. Das Spiel ist dann auch absolut spielfähig und sieht auch cool aus. Nun aber zum Problem: Wenn wir das Spiel nun aus einem _sehr_ einfachen Menü starten, also ein JFrame, der einen JButon enthält, (indem die obige Zeile ausgeführt wird), funktionieren die Keylistener nicht mehr. Scheinbar verliert der neu erzeugte Frame den Fokus oder erhält diesen erst gar nicht. Hattet ihr schon mal solche Probleme gehabt? Nach dem Starten des Programms aus dem Menü wissen wir auch gar nicht, wer den Fokus hat. Gibt es eine Möglichkeit, den Fokus manuell zu ändern? Das Problem ist, dass unsere Keylistener keine Keyevents bekommen. Gibt es eine Möglichkeit, alle ausgelösten Keyevents manuell an unseren Keylistener zu leiten?

Ich hoffe, ihr habt ne Idee. Wenn irgendwelche Informationen fehlen, sagt bescheid.

Monger
2007-06-07, 19:03:56
Ja, du kannst den Focus für ein Fenster explizit anfordern. Sollte eine Methode des JFrame sein.

Aber warum weißt du denn nicht, wer den aktuellen Focus hat? Das siehst du doch an der Titelleiste, welches Fenster gerade aktiv ist.

Shink
2007-06-07, 19:11:34
Nun ja, was soll ich sagen: Bei Spielen in Java ist es ein leichtes, an Swing/AWT "vorbeizuprogrammieren", sodass das Verhalten dann unvorhersehbar ist.

Am besten nach einem Tutorial für Spiele unter Swing vorgehen oder jetzt: Eins suchen und schauen, wo man da wie anders vorgeht.

Eigentlich sollte das genannte Verhalten nämlich nicht vorkommen (wenn man nicht grad ein ungewöhnliches JRE verwendet wie z.B. GCC-GCJ).

Monger
2007-06-07, 19:22:57
Weil du grad was von vorbeiprogrammieren sags: könnte so ein Effekt auftreten, wenn man kein "InvokeLater" verwendet? Vielleicht würde das hier helfen...

Sliver21
2007-06-07, 20:40:27
Shink, du hast es erfasst. Was da passiert, ist total unvorhergesehen. Wenn wir unser Spiel starten, wird die Auflösung , wenn nötig, angepasst und es wechselt in den Vollbildmodus. Dadurch sehen wir auch keinen Frame mehr. Ich schau mal, ob mir noch was einfällt.

EDIT: Problem gelöst.
Die Spielklasse erbt jetzt von Thread und dadurch wird aus dem Menü ein neuer Thread gestartet. Und so funktioniert es dann.