Модальное диалоговое окно скрывается за основным кадром после переключения фокуса - PullRequest
4 голосов
/ 12 апреля 2011

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

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

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

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

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;
}

Ответы [ 4 ]

2 голосов
/ 12 апреля 2011

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

1 голос
/ 13 апреля 2011

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

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 Я бы все же сосредоточился на проверке вашего кода.

Ой & Удачи, Боро.

0 голосов
/ 09 января 2012

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

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

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

0 голосов
/ 12 апреля 2011

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

...