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