在JOptionPane
中,我想在发送空值作为组件父级时设置父Component
。
为父级: 定义要作为此对话框的父级的Component。它以两种方式使用:包含它的Frame用作对话框的Frame父级,其屏幕坐标用于放置对话框。通常,对话框位于组件的正下方。 此参数可以为null,在这种情况下,默认Frame用作父 ,对话框将以屏幕为中心(取决于L& F)。
这就是JOptionPane
的工作原理,现在我想做同样的事情,但不知道如何获取默认框架并将其设置为显示通知的父框架。我正在使用NotificationManager
来显示WebLaF L& F中包含的通知,但是当我尝试在setVisible之前显示通知时Frame
它会抛出此错误
“没有可见的窗口显示通知”
它来自这里:NotificationManager
class:在将空组件作为父项发送时获取窗口的方法
private static Window getDefaulShowForWindow ()
{
final Window activeWindow = SwingUtils.getActiveWindow ();
if ( activeWindow != null )
{
return activeWindow;
}
final Window[] allWindows = Window.getWindows ();
if ( allWindows != null && allWindows.length > 0 )
{
return allWindows[ 0 ];
}
throw new RuntimeException ( "There is no visible windows to display notification" );
}
SwingUtils
class:方法getActiveWindow()
public static Window getActiveWindow ()
{
final Window[] windows = Window.getWindows ();
Window window = null;
for ( final Window w : windows )
{
if ( w.isVisible () && w.isActive () && w.isFocused () )
{
window = w;
break;
}
}
return window;
}
所以我想知道的是JOptionPane
在将Component
作为父级发送时(在代码中)做了什么。
答案 0 :(得分:1)
如果您查看JOptionPane
,它最终会以showOptionDialog(Component, Object, String, int, int, Icon, Object[], Object)
在此方法中,parentComponent
为null
时,会调用getRootFrame
。这做了一些有趣的工作。基本上它适用于SwingUtilities
到"找到"一个合适的Frame
使用。如果一个人不存在,它将构成一个"共享"参考...
这是通过SwingUtilities.getSharedOwnerFrame
生成的,它会(最终)创建一个名为Frame
的{{1}},它已覆盖SharedOwnerFrame
方法,因此永远无法显示。 ..
这一切都是在包私有级别内完成的,因此您无法自行调用任何此类功能...
<强>更新强>
我应该指出所有show
s使用SharedOwnerFrame
的相同实例