如何将默认Frame用作父组件?

时间:2014-08-22 02:30:59

标签: java swing window joptionpane look-and-feel

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作为父级发送时(在代码中)做了什么。

1 个答案:

答案 0 :(得分:1)

如果您查看JOptionPane,它最终会以showOptionDialog(Component, Object, String, int, int, Icon, Object[], Object)

结尾

在此方法中,parentComponentnull时,会调用getRootFrame。这做了一些有趣的工作。基本上它适用于SwingUtilities到"找到"一个合适的Frame使用。如果一个人不存在,它将构成一个"共享"参考...

这是通过SwingUtilities.getSharedOwnerFrame生成的,它会(最终)创建一个名为Frame的{​​{1}},它已覆盖SharedOwnerFrame方法,因此永远无法显示。 ..

这一切都是在包私有级别内完成的,因此您无法自行调用任何此类功能...

<强>更新

我应该指出所有show s使用SharedOwnerFrame的相同实例