Как сфокусировать JFrame? - PullRequest
9 голосов
/ 13 марта 2009

Я пишу небольшую игру, в которой один JFrame содержит основную игру, а другой JFrame отображает счет. проблема в том, что когда я заканчиваю их конструировать, счет JFrame всегда оказывается сфокусированным! Я пытался вызвать ScoreDisplay.toFront (), ScoreDisplay.requestFocus () и даже:

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

Есть ли способ заставить эту работу? Заранее спасибо, Джон Мурано

Ответы [ 6 ]

8 голосов
/ 29 мая 2015

Вызовите метод requestFocus().

Это не гарантированно работает, потому что есть много причин, по которым операционная система не позволяет рамке фокусироваться. Может быть другой кадр с более высоким приоритетом в другом приложении. Есть также некоторые рабочие столы Linux, которые (если я правильно помню) не позволяют фреймам запрашивать фокус.

Чтобы дать вам больше шансов на успех, я также рекомендую вызвать метод toFront() перед запросом фокуса.

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

Пожалуйста, имейте в виду, что ничего из этого не гарантируется, потому что обработка кадров, особенно с фокусировкой и многоуровневой структурой, сильно зависит от операционной системы. Поэтому установите рамку видимой, переместите ее вперед и запросите фокусировку. После того, как вы откажетесь от EDT, операционная система, скорее всего, будет фокусироваться на кадре. По крайней мере, окно должно быть сверху.

8 голосов
/ 13 марта 2009

Toggle alwaysOnTop

Смотрите здесь:

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

Читайте о toFront в API http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Window.html#toFront

Некоторые платформы могут не разрешать эту виртуальную машину разместить свои окна над окнами родные приложения или Windows другие виртуальные машины.

В ОС Windows, например, toFront вызывает значок на панели задач мерцание, но окно остается в назад.

Единственная мысль, которая заставит окно впереди установлено всегда.

frame.setAlwaysOnTop(true); 
frame.setAlwaysOnTop(false);
4 голосов
/ 13 марта 2009

Я бы сделал так:

 frame.toFront();
 frame.setState(Frame.NORMAL); 

и если вы также хотите иметь больше контроля над этим, вы должны использовать requestFocuse.

Кстати, вот пример: http://coding.derkeiler.com/Archive/Java/comp.lang.java.gui/2006-06/msg00152.html

3 голосов
/ 13 марта 2009

Рассматривали ли вы выставить счет в том же кадре, что и игровой кадр?

Другой возможный (быстрый и грязный) вариант - создавать их в обратном порядке или, по крайней мере (если оценка зависит от игры), отображать их в обратном порядке.

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

Я предполагаю, что в настоящее время они:

game.setVisible( true );
score.setVisible( true );
0 голосов
/ 08 ноября 2016

Просто добавьте следующую строку кода над кодом JOptionPaneMessageDialog ... this.setAlwaysOnTop (ложь);

0 голосов
/ 11 июля 2012
frame.setExtendedState( JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);

Попробуйте выше ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...