swich焦点后,模态对话框隐藏在主框架后面

时间:2011-04-12 17:36:29

标签: java swing applet modal-dialog jdialog

我有一个swing应用程序,基本上是一个可以弹出模态对话框的主框架。 当模式对话框显示时,如果我切换到另一个窗口,如firefox。然后切换回swing应用程序。 JDialog不在前面了。

我不想将对话框AlwaysOnTop设置为true。因为那时对话框将在所有窗口的顶部包括其他过程中的窗口。

那么我该怎么办呢?当我回过头来时,模态对话框还在上面?

BTW:它是一个Applet,所以主框架实际上是这样设置的:

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 个答案:

答案 0 :(得分:2)

确保JDialog实际上是模态的。同时尝试将主框架设置为所有者。

答案 1 :(得分:1)

我不确定对话框的形式是否是关键问题。我测试了这种行为,当应用程序最大化时,对话框总是在前面弹出,而不管它是模态的。

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 我仍然会专注于检查你的代码。

Oi&祝你好运,博罗。

答案 2 :(得分:0)

我认为你所要求的是一个对象是Java应用程序/框架的模态,它是它的父级。当父级重新获得焦点时,您可以使用Toolkit.getDefaultToolkit()。getSystemEventQueue()。 postEvent(AWTEvent e)向对话框发出一个事件,使其弹回到顶部。

答案 3 :(得分:0)

感谢Boro link

我有同样的问题需要解决。带有swing applet的浏览器。对话框弹出,我点击浏览器,点击返回对话框,对话框消失在浏览器后面。我尝试了一切,但只有一件事有所帮助:

WindowListener添加到Dialog并致电聆听者toFront()中的windowDeactivated()