2010-10-23 4 views
5

Я хотел бы активировать приложение Swing программно. Я хочу сказать, что я хотел бы написать код, который заставит JFrame быть видимым и сфокусированным (заголовок окна должен быть выделен). Я попытался использовать requestFocus(). Он работает только в том случае, если приложение имеет не менее 2 окон A и B: A скрыто, B видно. Теперь, если я звоню A.requestFocus(), он становится активным, как я хочу. Этого не происходит, если приложение имеет только одно окно или если оба окна невидимы.Как активировать окно в Java?

Я нашел 2 обходных решения.

  1. использование поддельные прозрачные неэкранированные рамки, которые всегда сверху. Это поддельное окно будет играть роль окна B. Я не пытался его реализовать, но кажется, что он должен работать.
  2. звонок A.setAlwaysOnTop(true). Это приносит окно A поверх других окон. Но это еще не в фокусе. Используйте java.awt.Robot (mouseMove, mousePress, mouseRelease), чтобы сделать щелчок по заголовку окна A. Теперь вызовите A.setAlwaysOnTop(false) и верните указатель мыши обратно в предыдущее положение. Я реализовал код, и он работает, но он выглядит как уродливое обходное решение.

Есть ли «правильное» решение?

ответ

1

Это следует сделать это:

frame.setSelected(true); 

и вы, вероятно, хотите внутри попробовать/поймать блок ...

Если это не работает на ОС вы используете, есть еще две возможности:

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

и

frame.setVisible(true); 
frame.setVisible(true); // Yes you need this second one 
+0

Насколько я могу сказать, что нет 'метода Frame.setSelected' –

+0

это в JInternalFrame –

+0

Да, setSelected() умирает не существует до сих пор ... – AlexR

5
frame.setState(Frame.NORMAL); // restores minimized windows 
frame.toFront(); // brings to front without needing to setAlwaysOnTop 
frame.requestFocus(); 

все, что вам хотелось бы иметь, чтобы знать, в мельчайших деталях, увидеть эту страницу: http://www.developer.com/java/other/article.php/3502181/Window-Focus-and-State-in-Java.htm

+0

toFront() имеет смысл. Спасибо! – AlexR

+0

Используйте 'requestFocusInWindow' вместо' requestFocus', см. Http://download.oracle.com/javase/tutorial/uiswing/misc/focus.html. –

+0

@ Geoffrey - нет ... это для фокусировки компонентов * внутри * окон, а не самих окон. Может быть хорошей ссылкой для него, чтобы проверить, есть ли у него проблемы. –

1

Я был в одной лодке - ни одно из вышеперечисленных не работало.

«МОЙ» раствор следующим образом:

thisFrame.getWindowListeners()[0].windowActivated(
    new WindowEvent(
       thisFrame, 
       WindowEvent.WINDOW_ACTIVATED 
    ) 
); 
schedulesTable.requestFocus(); 

thisFrame = the window to get activated 

schedulesTable = my component in the window I wanted to get focus for 
+0

Спасибо. Хотя я задал этот вопрос много лет назад, и этот проект сейчас неактуальен, я, вероятно, попробую ваше решение. – AlexR

Смежные вопросы