如何获取对当前显示的Java Swing JD对话框的引用?

如何获取对当前显示的Java Swing JD对话框的引用?,java,swing,Java,Swing,我使用的是基于JavaSwing的框架,它使用JavaSwingJDialog框显示弹出消息。我需要得到它们的参考,这样我可以通过编程关闭它们。框架创建对话框,但不保留对它们的引用。我可以获得当前显示框的引用吗 谢谢 我没有办法知道当前作为帧的子帧打开的是什么-我只看到获取父帧的方法 你能改变当前调用对话框的类吗?如果是这样,您可以添加一个容器来跟踪事物的打开和关闭,并添加一些访问该容器的方法 然后可以检查并将其强制转换为JDialog 但正如我在上一个问题中所说的,您必须改变方法。您可以在Wi

我使用的是基于JavaSwing的框架,它使用JavaSwingJDialog框显示弹出消息。我需要得到它们的参考,这样我可以通过编程关闭它们。框架创建对话框,但不保留对它们的引用。我可以获得当前显示框的引用吗


谢谢

我没有办法知道当前作为帧的子帧打开的是什么-我只看到获取父帧的方法


你能改变当前调用对话框的类吗?如果是这样,您可以添加一个容器来跟踪事物的打开和关闭,并添加一些访问该容器的方法

然后可以检查并将其强制转换为JDialog


但正如我在上一个问题中所说的,您必须改变方法。

您可以在Window类上使用getWindows()方法获得对所有子窗口的引用

public static Window[] getWindows()

    Returns an array of all Windows, both owned and ownerless, created by this application. If called from an applet, the array includes only the Windows accessible by that applet.
请小心,因为我怀疑返回的其中一个窗口将是您的顶层框架/窗口。您可以检查窗口属性,如标题,以确定要关闭的对话框

还有更具体的版本:getOwnedWindows()和getOwnerlessWindows(),具体取决于您的需要。

试试这个:

import java.awt.Window;
import javax.swing.JDialog;

public class Test {
    public static void main(String[] args) {
        JDialog d = new JDialog((Window)null,"Demo Dialog");
        for (Window w : JDialog.getWindows()) {
            if ( w instanceof JDialog) {
                System.out.println(((JDialog)w).getTitle());
            }
        }
    }
}
如果您对以下问题感到困惑:

(Window)null
cast,只需尝试在不使用它的情况下编译:)

(顺便说一句,将空窗口传递给构造函数将创建一个无主对话框)


编辑:请注意,这将为您提供对所有对话框的引用,无论它们是否如代码所示可见。要修复它,只需使用isVisible()查询对话框是否可见,如果显式创建
JDialog
,而不是使用
JOptionPane。showXXX
您将已经有了对该对话框的引用。这绝对是我的首选方法;e、 g

JDialog dlg = new JDialog(null, "My Dialog", false); // Create non-modal dialog.
dlg.setLayout(new BorderLayout());
dlg.add(myPanel, BorderLayout.CENTER);
dlg.pack();
dlg.setLocationRelativeTo(null);
dlg.setVisible(true);

如果您想获得对最前面的JDialog的引用,那么您必须侦听AWT事件,并将该引用更新为“live”,并将其存储在某个地方

以下是我在自己的Swing框架中所做的工作:

public class ActiveWindowHolder
{
    public DefaultActiveWindowHolder()
    {
        _current = null;
        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
        {
            public void eventDispatched(AWTEvent e)
            {
                DefaultActiveWindowHolder.this.eventDispatched(e);
            }
        }, AWTEvent.WINDOW_EVENT_MASK);
    }

    public Window getActiveWindow()
    {
        return _current;
    }

    private void eventDispatched(AWTEvent e)
    {
        switch (e.getID())
        {
            case WindowEvent.WINDOW_ACTIVATED:
            _current = ((WindowEvent) e).getWindow();
            break;

            case WindowEvent.WINDOW_DEACTIVATED:
            _current = null;
            break;

            default:
            // Do nothing (we are only interested in activation events)
            break;
        }
    }

    private Window _current;    
}

只需确保在显示任何组件之前在主线程中实例化
ActiveWindowHandler
;从这一点开始,每次调用
ActiveWindowHandler.getActiveWindow()
都将返回最前面的窗口(JFrame的
JDialog
)。

或者将对话框设置为模态,这将使您的生活变得非常轻松……
或者,当您初始化JDialog时,请执行以下操作:

JDialog d = new JDialog();  
d.addWindowListener(new WindowAdapter(){
    public void windowClosed(WindowEvent e){
        dialogClosedAlertFunction(); //goes wherever you want it to go
    }
});

从1.6开始,顺便说一句,使用合理的框架比尝试破解要好得多。在WebStart/PlugIn中运行时,您可能会发现在某些情况下也会出现一个虚拟对话框。@Tom,我同意您的框架/破解评论,但是我从Eugene的回答中怀疑Dave已经被建议修改框架一次了。他可能想在代码的其他/不相关的部分进行引用。因此,我提出了一个回复所有对话框引用的答案…@Sawas:你可能是对的,但老实说,这听起来像是糟糕的设计。你能澄清一下,你是想找到所有Jdialog的引用,还是只看到前台的引用?从我的博客中签出这很好。:-)当
WINDOW\u DEACTIVATED
事件发生时,为什么要将其设置为
null
?@Kurtibert当最后一个窗口关闭时,可能会发生这种情况,因此没有剩余的活动窗口。