Focus beim öffnen eines neuen JFrames

Status
Nicht offen für weitere Antworten.

m1cHi

Mitglied
huhu,
ich hab ein kleines Problem mit dem Focus.
Ich habe ein kleines Spielchen programmiert welches man mit den Pfeiltasten (KeyListener) gesteuert wird. Dieses Spiel läuft in einem JFrame ab. Diesem JFrame ist auch der KeyListener geadded.
Jetzt wollte ich noch ein kleines Menü schreiben indem man ein paar Einstellungen machen kann und das Level auswählen kann (ein extra JFrame mit einer JCombobox und einigen Buttons).

Das ganze soll so funktionieren:
Wenn das Programm gestartet wird öffnet sich das kleine Fenster für die Einstellungen. Sind alle Einstellungen gemacht drückt der Spieler einen "start" Button in diesem Fenster. Das kleine Fenster soll sich schliessen und das große Fenster in dem das Spiel abläuft soll sichtbar werden. Ist das Spiel zuende soll sich das große Fenster wieder schliessen und das kleine Fenster wieder sichtbar werden.

sobalt ich nun "start" drücke öffnet sich zwar das große Fenster. Aber der KeyListener funktioniert nicht. Nach ein bisschen suchen bin ich dazu gekommen das es wohl daran liegt das der JFrame des großen Fensters kein Focus hat.
Ich habe es jetzt mit requestFocus() probiert, allerdings ohne Erfolg. Wenn ich mir danach isFocused() ausgeben lasse kriege ich immernoch false als Ergebnis.
Wie kriege ich den Focus auf dieses Fenster? :?:


Der ActionListener in meinem kleinen Fenster:

Code:
	public void actionPerformed(ActionEvent e) {
   		if (e.getActionCommand() == "Start") {
            frame.setVisible(false);
			   game = new Game();
            frame.setVisible(true);
		}
                .....
	}


Im Konstruktor meiner Game Klasse steht folgendes:
Code:
Game() {
		frame = new JFrame(":)");
		frame.setBounds(100,100,SIZE_X,SIZE_Y);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setFocusable(true);
		frame.requestFocus();
		frame.addKeyListener(new GameKeyListener(background));
	   frame.setVisible(true);
                ....
}

/e:
Um eventuelle Verwirrung zu beseitigen: frame heißt mein JFrame in dem kleinen Fenster und der JFrame in dem großen Fenster. Es sind also beides nicht die selben JFrames.
 
Habe ich schon. Habe aber auch keinen Unterschied feststellen können 🙁

Ich habe eben bemerkt das der KeyListener doch reagiert. Allerdings erst am Ende des Spiels (wenn sich das große Fenster wieder schliesst).
Um dahinter zu kommen hab ich eben mal 2 Testprogramme geschrieben in denen genau das selbe Problem auftritt.

Code:
public class Fenster1 {
    private JFrame frame;
    private JButton button;
    
    Fenster1() {
        frame = new JFrame("Fenster1");
        button = new JButton("Button");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("button gedrückt");
                frame.setVisible(false);
                new Fenster2();
            }
        });
        frame.add(button);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(300, 300, 200, 200);
        frame.setVisible(true);
    }
    
    public static void main(String args[]) {
        new Fenster1();
    }
}

Code:
public class Fenster2 {
    private JFrame frame;
    
    Fenster2() {
        frame = new JFrame("Fenster2 :)");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 200, 400);
        frame.setVisible(true);
        
        frame.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                System.out.println("Taste gedrückt (Fenster2)");
            }
        });
        for (int a=0; a<50; a++) {
            try {
                Thread.sleep(100);
            } catch (Exception e) { }
            Graphics g = frame.getGraphics();
            g.drawRect(a, a, 100, 100);
        }
    }
    
    public static void main (String args[]) {
        new Fenster2();
    }
}

Die Klasse Fenster1 erstellt einfach nur ein Fenster mit einem JButton. Sobalt man den Button drückt öffnet sich Fenster2. Fenster2 zeichnet 50 Rechtecke mit kleinen Zeitabständen. Zudem hat Fenster2 einen KeyListener der "Taste gedrückt" ausgibt sobalt man eine Taste drückt.

Wenn ich jetzt die main Methode der Klasse Fenster2 aufrufe funktioniert alles wunderbar. Die Rechtecke werden gezeichnet und wenn ich währenddessen eine Taste drücke wird "Taste gedrückt" auf der Console ausgegeben.

Wenn ich allerdings die main Methode von der Klasse Fenster1 starte öffnet sich das Fenster mit dem Button. Wenn ich den Button drücke verschwindet das Fenster wieder und Fenster2 erscheint. Die Rechtecke werden gezeichnet. Allerdings passiert nichts wenn ich eine Taste drücke. Wenn dann alle Rechtecke gezeichnet sind werden auf der Console erst die Meldungen "Taste gedrückt" ausgegeben.

Woran liegt das und wie krieg ich das weg? :?
 
Deine Schleife blockiert den EventDispatcher-Thread. Solange sie läuft können keine Events verarbeitet werden.
 
Aber wieso blockiert die Schleife diesen Thread nur wenn ich das Fenster aus dem anderen Fenster heraus starte? Wenn ich es direkt starte funktioniert ja alles wunderbar 🙁
 
Die main Methode läuft nicht im EDT. Der wird still und leise im Hintergrund gestartet.
Wenn du das eine Fenster aber aus dem anderen heraus started, dann bist du bereits im EDT, woraufhin dieser blockiert.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben