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

时间:2012-02-08 14:40:25

标签: java swing singleton containers

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

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

那么,有没有办法引用顶级容器而不必诉诸单例模式?如果有人需要更多信息,请告诉我!

感谢。

3 个答案:

答案 0 :(得分:4)

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

SwingUtilities.getWindowAncestor(anyComponent);

此课程还有其他有用且类似的方法,例如windowForComponent(Component c) getDeepestComponentAt(...)getRoot(Component c)

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

答案 1 :(得分:2)

1)当前JVM实例可以返回Top-level Containers的数组,包括已处置的

Window[] allWindows = Window.getWindows();

默认情况下,所有Top-level Containers都可以访问并准备好使用re_use

2)JFrame可以返回所有孩子,包括处置,通知是否有2.或更多JFrame然后需要使用getWindows()

Window[] allWindows = Window.getOwnedWindows();

答案 2 :(得分:0)

您可以使用指定的父对象创建对话框(JDialog),这样您就可以存储对父对象的引用,看看JDialog构造函数:

public JDialog(Frame owner)

http://docs.oracle.com/javase/6/docs/api/javax/swing/JDialog.html#JDialog%28java.awt.Frame%29