[英]Programatically closing currently displayed Java Swing JDialog box
[英]How do I get a reference to the currently displayed Java Swing JDialog box?
我正在使用基于Java Swing的框架,该框架使用Java Swing JDialog框显示弹出消息。 我需要获得它们的参考,以便以编程方式关闭它们。 该框架创建对话框,但不保留对它们的引用。 我可以参考当前显示的框吗?
谢谢。
尝试这个 :
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
强制转换,只需尝试在没有它的情况下进行编译:)
(顺便说一句,将空窗口传递给构造函数会创建一个未拥有的对话框)
编辑:请注意,这将为您提供对所有对话框的引用,无论它们是否如代码所示都是可见的。 要解决此问题,只需使用isVisible()查询对话框是否可见
如果要获取对最前面的JDialog的引用,则必须侦听AWT事件并“实时”更新此引用并将其存储在某个地方。
这是我在自己的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()
起,每次对ActiveWindowHandler.getActiveWindow()
调用都将返回最前面的窗口( JFrame
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()取决于您的需求。
我没有办法知道当前作为框架的子框架打开的内容-我只看到获取父框架的方法。
您可以更改当前类以调用对话框吗? 如果是这样,您可以添加一个容器来跟踪事物的打开和关闭,并添加一些访问该容器的方法。
窗口w = KeyboardFocusManager.getCurrentKeyboardFocusManager()。getFocusedWindow();
然后,您可以检查并将其投射到JDialog。
但是就像我在上一个问题中所说的那样-您必须更改方法。
如果您显式创建JDialog
而不是使用JOptionPane.showXXX
您将已经具有对该对话框的引用。 这绝对是我首选的方法; 例如
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时,请执行以下操作:
JDialog d = new JDialog();
d.addWindowListener(new WindowAdapter(){
public void windowClosed(WindowEvent e){
dialogClosedAlertFunction(); //goes wherever you want it to go
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.