Как сфокусировать JFrame?
-
22-07-2019 - |
Вопрос
Я пишу небольшую игру, в которой один 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);
Попробуйте вышеупомянутое ..