2009-03-13 29 views
6

Ich schreibe ein kleines Spiel, mit einem JFrame, der das Hauptspiel enthält, und einem weiteren JFrame, der den Spielstand anzeigt. Das Problem ist, wenn ich fertig bin, sie zu konstruieren, endet die Punktzahl JFrame immer fokussiert! Ich habe versucht, scoreDisplay.toFront() aufrufen, scoreDisplay.requestFocus() und sogar:Wie fokussiere ich einen JFrame?

display.setState(JFrame.ICONIZED); 
display.setState(JFrame.NORMAL); 

Gibt es eine Möglichkeit, diese Arbeit zu machen? Vielen Dank im Voraus, john murano

+0

Für zukünftige Besucher, die ein JFrame konzentrieren möchten, finden Sie in meiner Antwort auf der Seite, die 'frame.requestFocus()' verwendet. Die angenommene Antwort löst das Problem von OP, aber die Lösung ist sehr spezifisch für seine Situation. –

Antwort

2

Haben Sie betrachten die Partitur im selben Rahmen wie das Spiel Rahmen einstellen?

Andere mögliche (schnell und schmutzig) Option ist es, sie in umgekehrter Reihenfolge zu erstellen, oder zumindest (wenn der Spielstand vom Spiel abhängt) in umgekehrter Reihenfolge anzuzeigen.

score.setVisible(true); 
game.setVisible(true); 

Meine Vermutung ist derzeit, dass sie sind:

game.setVisible(true); 
score.setVisible(true); 
+0

Vielen Dank. Diese Lösung funktioniert perfekt! –

+2

Während diese Lösung das Problem des OP löst, beantwortet es nicht die Titelfrage. –

6

Toggle alwaysOnTop

Siehe hier:

http://forums.sun.com/thread.jspa?threadID=5124278

Lesen Sie mehr über toFront in der API http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#toFront

Einige Plattformen können diese VM nicht zulassen sein Windows über die Fenster von nativen Anwendungen oder Windows von anderen VMs zu platzieren.

Unter Windows OS zum Beispiel toFront das Symbol in der Taskleiste zu Flimmern verursacht, aber das Fenster bleibt im zurück.

Der einzige Gedanke, der das Fenster nach vorne zwingt, ist setAlwaysOnTop.

frame.setAlwaysOnTop(true); 
frame.setAlwaysOnTop(false); 
+0

Danke. Das funktionierte für mich, mit der Einschränkung, dass ich sie (sofort) nach frame.setVisible (true) nennen musste. Ich denke, das macht Sinn, aber ich habe sie getrennt gemacht. – ensignr

-2
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
frame.setVisible(true); 

die oben Versuchen ..

6

Rufen Sie die requestFocus() Methode.

Dies funktioniert nicht garantiert, da es viele Gründe gibt, warum ein Betriebssystem den Fokus eines Frames nicht zulassen würde. Es könnte einen anderen Rahmen mit höherer Priorität in einer anderen Anwendung geben. Es gibt auch einige Linux-Desktops, die Frames (wenn ich mich richtig erinnere) nicht erlauben, den Fokus anzufordern.

Um Ihnen eine bessere Chance auf Erfolg zu geben, empfehle ich auch, die Methode toFront() aufzurufen, bevor Sie den Fokus anfordern.

frame.setVisible(true); 
frame.toFront(); 
frame.requestFocus(); 

Bitte denken Sie daran, nichts davon ist garantiert, da Frame-Handling, vor allem mit Fokus und Schichtung, ist sehr betriebssystemabhängig. Setzen Sie den Rahmen also auf sichtbar, bewegen Sie ihn nach vorne und fordern Sie den Fokus an. Sobald Sie die EDT aufgeben, wird das Betriebssystem wahrscheinlich den Rahmen den Fokus geben. Zumindest sollte das Fenster oben sein.

0

Fügen Sie einfach die folgende Codezeile über den JOptionPaneMessageDialog-Code ... this.setAlwaysOnTop (false);

Verwandte Themen