JDialog.setAlwaysOnTop (true) выводит все диалоговые окна на передний план под Windows

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

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

Тестовый пример (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){}
    }       
}
}

person Peter    schedule 19.01.2012    source источник
comment
Не знаю, будет ли это иметь значение, но вы можете начать с соблюдения политики потоков Swing и использовать только компоненты Swing из EDT.   -  person JB Nizet    schedule 19.01.2012
comment
Вы все еще создаете и изменяете компоненты Swing в основном потоке. Все, кроме сна, нужно делать на EDT.   -  person JB Nizet    schedule 19.01.2012
comment
Ты прав! Но результат остается прежним.   -  person Peter    schedule 19.01.2012
comment
@JBNizet: я думаю, что код в порядке, учитывая EDT [ссылка] java.sun.com/products/jfc/tsc/articles/threads/threads1.html   -  person Peter    schedule 19.01.2012
comment
Нет, это не так. Прочтите docs.oracle.com/javase / 6 / документы / api / javax / swing /. Статья, на которую вы ссылались, датируется 1998 годом и устарела.   -  person JB Nizet    schedule 19.01.2012
comment
Моя ошибка: см. Также [ссылка] stackoverflow.com/questions/491323/   -  person Peter    schedule 19.01.2012


Ответы (1)


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

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

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

person Peter    schedule 24.01.2012