如何在整个应用程序中引用顶级容器(例如JFrame
)而不使其成为单例?我问的原因是我试图避免使用单身反模式。
无论如何,我发现当我需要另一个顶级容器(例如JDialog
)向用户显示简单消息时,我希望将此对话框直接放在前面提到的JFrame
上使用setLocationRelativeTo(frame)
。但我能够这样做的唯一方法(目前)是制作JFrame
的单个实例并使用静态getInstance
方法访问它。
那么,有没有办法引用顶级容器而不必诉诸单例模式?如果有人需要更多信息,请告诉我!
感谢。
答案 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