2012-01-19 2 views
4

Я создаю два диалога:
DialogA: setVisible(true) называется только один раз.
DialogB: setVisible(true) и setAlwaysOnTop(true) называется каждые 1,5 секJDialog.setAlwaysOnTop (true) выводит все диалоги на передней панели под Windows

Окна: Каждый вызов dialogB.setAlwaysOnTop(true) приносит dialogA И dialogB на фронт.
OSX: Каждый вызов dialogB.setAlwaysOnTop (true) выводит только диалогB спереди. (Ожидаемое поведение)

Test Case (Windows):

1 я запустить приложение из моего IDE.
2 Я вижу DialogA.
3 Я щелкаю по IDE, и DialogA исчезает.
4 Через одну секунду отобразятся DialogA и DialogB.
5 Я щелкаю по IDE, а DialogA и DialogB исчезает. GOTO 4

Ожидаемое поведение (OSX):
4. Через одну секунду появится DialogB.
5. Я нажимаю IDE, и DialogB исчезает. GOTO 4

Вопрос:
Как получить ожидаемое поведение под Windows?

import javax.swing.JDialog; 
import javax.swing.JLabel; 
public class JDialogSetAlwaysonTopTEST 
{ 
public static void main(String[] p_Strings) 
{ 
    final JDialog dialogA = new JDialog(); 
    dialogA.setLocation(0, 0); 
    dialogA.add(new JLabel("DialogA: Click on the overlapped window"));  
    java.awt.EventQueue.invokeLater(new Runnable() {   
     public void run() { 
      dialogA.pack(); 
      dialogA.setVisible(true); 
     } 
    }); 

    try {Thread.sleep(3000);} catch (InterruptedException e){} 

    final JDialog dialogB = new JDialog(); 
    dialogB.setLocation(70, 70); 
    dialogB.add(new JLabel("DialogB: Do you see DialogA?")); 

    java.awt.EventQueue.invokeLater(new Runnable() {   
     public void run() { 
      dialogB.pack(); 
      dialogB.setVisible(true); 
     } 
    }); 

    while(true) 
    { 
     java.awt.EventQueue.invokeLater(new Runnable() {     
      public void run() { 
       dialogB.setAlwaysOnTop(true); //prerequisite 
       dialogB.setVisible(true); 
       dialogB.setAlwaysOnTop(false); //prerequisite 
      } 
     });   
     try {Thread.sleep(1500);} catch (InterruptedException e){} 
    }  
} 
} 
+0

Не знаю, если это будет иметь значение, но вы могли бы начать соблюдая политику потоков Swing, и используйте только компоненты Swing из EDT. –

+3

Вы по-прежнему создаете и изменяете компоненты поворота в основном потоке. Все, кроме сна, должно быть сделано на EDT. –

+0

Вы правы! Но результат остается тем же. – Peter

ответ

1

Я нашел «грязное» решение моей проблемы.

final JDialog dialogA = new JDialog(new JFrame()); 
... 
final JDialog dialogB = new JDialog(new JFrame()); 

Если каждый диалог имеет независимый владелец dialogB.setAlwaysOnTop (истина), dialogB.setVisible (истина) не влияет на dialogA

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