2016-12-22 9 views
0

Я использовал Java и Swing.JWindow всегда сверху

У меня есть два окна MainWindow и PointWindow.

MainWindow - это окно JFrame.

PointWindow распространяется JWindow.

Я хочу сохранить PointWindow всегда сверху (никогда не под другими окнами или компонентами). Я установил в конструкторе PointWindow a setAlwaysOnTop(true), но проблема в том, когда я нажимаю до MainWindow (фокус), затем по-другому, например, нажимаем на мой рабочий стол (пустое пространство) и пытаемся перетащить PointWindow, тогда он находится под моим MainWindow.

Есть ли способ сохранить PointWindow всегда поверх всех компонентов?

EDIT

В конструкторе я попытался с помощью WindowListener ниже

this.addWindowListener(new WindowAdapter() { 
    @Override 
    public void windowDeactivated(WindowEvent e) { 
     toFront(); 
    } 

    @Override 
    public void windowLostFocus(WindowEvent e) { 
     toFront(); 
    } 
}); 

... но это не работает, события не поймают

+0

setAlwaysOnTop (true); должен это сделать –

+0

Но не надо. Проблема показывает, когда я потерял фокус на «PointWindow», нажмите на другое (а не проектное) место и попробую перетащить. – ACz

+0

вы можете прослушивать другие события (прослушиватель состояния окна) или создавать «сверху» для вызова .toFront(); –

ответ

0

РЕШЕНИЕ

Я добавить MouseAdapter как MouseListener к PointWindow и когда mousePressed событие обнаруживается тогда делать toFront() и работать хорошо, но есть один побочный эффект, это означает, что есть момент, когда окно скрыть и показать (очень быстро).

1

Если оба окна принадлежит то же приложение,

setAlwaysOnTop(true); 

способ должен сделать, что вы хотите.

Если ваше окно должно оставаться на вершине, даже если ваше приложение потеряло фокус, вам нужно периодически его возвращать. Если другое окно получило фокус, вы не можете контролировать это, но вы можете использовать поток, чтобы вывести свое окно назад.

В следующем примере, фр Ваше окно

Thread th = new Thread(){ 
     public void run(){ 
      boolean live = true; 
      while(live){ 
       try{ 
        fr.toFront(); 
        fr.setAlwaysOnTop(true); 
       }catch(Exception e1){ 
        e1.printStackTrace(); 
       } 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
     } 
} 

Этот код будет толкать окно обратно на фронт каждые 100 мс, это должно быть обделяя для большинства применений. Это не лучшее решение, но оно должно работать

EDIT:

если вы просто хотите, чтобы окно, чтобы быть на передней части другого окна (события после того, как фокус восстановления), вы можете добавить и

a FocusListener Вашему JFrame и позвоните в Front на своем окне, когда загорается событие focusGained (FocusEvent e).

Или вы можете создать JWindow с рамой в качестве родителя: новый JWindow (jframeParent); Таким образом, ваш JWindow получит все события.

Или только с помощью непараметризованный JFrame вместо JWindow

EDIT2:

Если вы просто хотите, чтобы окно быть на вершине, при клике, MouseListener является правильный способ сделать это.

+0

Хмм, может быть, я могу определить, когда мой JWindow восстанавливает фокус, а затем запускает Thread? – ACz

+0

см. Редактирование. Вы можете обнаружить, когда ваш jframe набирает фокус и толкает тогда окно поверх него и снова устанавливает allwaysOnTop –

+0

FocusListener не обнаруживает. Я нашел решение, как писал. Спасибо за ваш ответ :) – ACz