我正在使用基于Java Swing的框架,该框架使用Java Swing JDialog框显示弹出消息。我需要得到它们的参考,所以我以编程方式关闭它们。框架创建对话框但不保留对它们的引用。我可以获得对当前显示的框的引用吗?
感谢。
答案 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
}
});