如何获取当前显示的Java Swing JDialog框的引用?

时间:2009-08-19 18:43:00

标签: java swing

我正在使用基于Java Swing的框架,该框架使用Java Swing JDialog框显示弹出消息。我需要得到它们的参考,所以我以编程方式关闭它们。框架创建对话框但不保留对它们的引用。我可以获得对当前显示的框的引用吗?

感谢。

7 个答案:

答案 0 :(得分:4)

试试这个:

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

强制转换,只需在没有它的情况下尝试编译:)

(BTW将空窗口传递给构造函数创建一个无主对话框)

编辑:请注意,这将为您提供对所有对话框的引用,无论它们是否在代码演示时都可见。要修复它,只需使用isVisible()

查询对话框是否可见

答案 1 :(得分:1)

您可以使用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(),具体取决于您的需求。

答案 2 :(得分:1)

如果你想获得对最前面的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()都会返回最前面的窗口(JDialog JFrame}。

答案 3 :(得分:0)

我没有办法知道当前作为一个框架的子项打开的内容 - 我只看到获取父框架的方法。

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

答案 4 :(得分:0)

Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager()。getFocusedWindow();

然后您可以检查并将其投射到JDialog。

但就像我在上一个问题中所说的那样 - 你必须改变你的方法。

答案 5 :(得分:0)

如果您明确地创建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);

答案 6 :(得分:0)

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

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