如何在整个应用程序中引用顶级容器而不使其成为单例?

mre*_*mre 4 java singleton swing containers

如何JFrame在整个应用程序中引用顶级容器(例如 a )而不使其成为单例?我问的原因是我试图避免单例反模式。

无论如何,我发现当我需要另一个顶级容器(例如 a JDialog)向用户显示一条简单的消息时,我希望将此对话框直接放置在上述JFrame使用setLocationRelativeTo(frame). 但我可以这样做的唯一方法(目前)是创建 的单个实例JFrame并使用静态getInstance方法访问它。

那么,有没有一种方法可以引用顶级容器而不必求助于单例模式?如果有人需要更多信息,请告诉我!

谢谢。

Hov*_*els 5

如果您有对顶级窗口中保存的任何 Swing 组件的引用,例如可以从 Event 对象的(例如 ActionEvent)getSource()方法获取,您可以使用它通过SwingUtilities方法获取顶级窗口:

SwingUtilities.getWindowAncestor(anyComponent);
Run Code Online (Sandbox Code Playgroud)

这个类还有其他有用和类似的方法,例如windowForComponent(Component c) getDeepestComponentAt(...)getRoot(Component c)

否则,您始终可以通过构造函数或 setter 参数传递引用。

  • 另请参阅 [`JComponent.getTopLevelAncestor()`](http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#getTopLevelAncestor%28%29)。+1 指向 `gWA()` 的指针 - 我今天的学习项目。:) (2认同)