Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Переключить 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   вызывает значок на панели задач   мерцание, но окно остается в   назад.

     

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top