Модальный диалог скрывается за основным фреймом после переключения фокуса

У меня есть приложение Swing, в основном основной фрейм, который может открывать модальный диалог. Когда отображается модальный диалог, если я переключаюсь в другое окно, например firefox. А затем снова переключитесь на приложение Swing. JDialog больше нет впереди.

Я не хочу, чтобы диалоговое окно AlwaysOnTop было истинным. потому что тогда диалоговое окно будет поверх всех окон, включая окна в другом процессе.

Итак, что мне делать, чтобы, когда я вернусь, модальный диалог все еще был наверху?

Кстати: это апплет, поэтому основной фрейм на самом деле устанавливается следующим образом:

private static Frame findParentFrame(Container owner){
    Container c = owner;
    while(c != null){
        if (c instanceof Frame)
            return (Frame)c;
        c = c.getParent();
    }
    return (Frame)null;
}

person Leon    schedule 12.04.2011    source источник


Ответы (4)


Я не уверен, является ли модальность диалога здесь ключевой. Я протестировал это поведение, и диалоговое окно всегда появляется на передней панели, когда приложение развернуто, независимо от того, является ли оно модальным.

import java.awt.event.ActionEvent;
import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;

public class AppletTest extends JApplet
        implements ActionListener
{
    private static final long serialVersionUID = 1L;
    private Frame findParentFrame()
    {
        Container c = this;
        while(c != null)
        {
            if(c instanceof Frame)
                return (Frame) c;

            c = c.getParent();
        }
        return (Frame) null;
    }
    private void createGUI()
    {
        Container content = getContentPane();
        content.setBackground(Color.white);
        content.setLayout(new FlowLayout());
        content.add(new JButton("Button 1"));
        content.add(new JButton("Button 2"));
        content.add(new JButton("Button 3"));
        JDialog d = new JDialog(findParentFrame());
        d.setModal(true);
        d.setVisible(true);
    }

    public void init()
    {
        try
        {
            SwingUtilities.invokeAndWait(new Runnable()
            {
                public void run()
                {
                    createGUI();
                }
            });
        }catch(Exception e)
        {
            System.err.println("createGUI didn't successfully complete");
        }
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
    }
}

Посмотрите на приведенный мною пример. Вы можете прокомментировать строку с помощью d.setModal(true);, и результат будет точно таким же. Я бы посоветовал вам еще раз проверить свой код или показать его нам, так как кажется, что вы могли что-то там упустить.

PS: Я нашел в Интернете другое решение, похожее на хакерское: http://www.codeguru.com/forum/showthread.php?t=41536 Я бы все же сосредоточился на проверке вашего кода.

Ой, удачи, Боро.

person Boro    schedule 13.04.2011

Убедитесь, что JDialog действительно модальный. Также попробуйте установить главный фрейм в качестве владельца.

person jzd    schedule 12.04.2011
comment
ой, только что заметил хозяин не основной рамы, я просто вопрос редактировал - person Leon; 12.04.2011
comment
@Leon, я думаю, что мой ответ все еще актуален. Установите владельца как фрейм, к которому вы хотите прикрепить JDialog. Также убедитесь, что он действительно модальный. - person jzd; 12.04.2011

Я думаю, что вы просите о диалоге, который является модальным для приложения / фрейма Java, являющегося его родительским. Когда родитель вернет фокус, вы можете использовать Toolkit.getDefaultToolkit (). GetSystemEventQueue (). postEvent (AWTEvent e), чтобы запустить событие в диалоговом окне, чтобы вернуть его наверх.

person karakuricoder    schedule 12.04.2011

Спасибо, Боро, за ссылку!

У меня была идентичная проблема, которую мне нужно было решить. Браузер с качающимся апплетом. Появляется диалоговое окно, я нажимаю на обозреватель, снова щелкаю по диалоговому окну, и диалоговое окно исчезает за обозревателем. Все перепробовала, но помогло только одно:

Добавление WindowListener в Dialog и вызов toFront() в windowDeactivated() слушателя сработало для меня.

person gonadarian    schedule 09.01.2012