Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在整个应用程序中引用顶级容器而不使其成为单个容器?_Java_Swing_Singleton_Containers - Fatal编程技术网

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

Java 如何在整个应用程序中引用顶级容器而不使其成为单个容器?,java,swing,singleton,containers,Java,Swing,Singleton,Containers,如何在整个应用程序中引用顶级容器(例如JFrame),而不使其成为单例?我问这个问题的原因是我试图避免使用单例反模式 无论如何,我发现当我需要另一个顶级容器(例如JDialog)向用户显示简单消息时,我希望使用setLocationRelativeTo(frame)将此对话框直接放置在前面提到的JFrame上。但是,我唯一能做到的方法(目前),是创建JFrame的单个实例,并使用静态getInstance方法访问它 那么,有没有一种方法可以引用顶级容器而不必求助于单例模式?如果有人需要更多信息,

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

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

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


谢谢。

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

此类还有其他有用的类似方法,例如
windowForComponent(组件c)
getDeepestComponentAt(…)
getRoot(组件c)


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

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

public JDialog(Frame owner)

1)当前JVM实例可以返回顶级容器的数组,包括

Window[] allWindows = Window.getWindows();
默认情况下,所有顶级容器都可以访问并准备好重新使用

2)
JFrame
可以返回所有child,包括disposed,注意是否有第2个或更多JFrame,然后返回所需用法
getWindows()


如果单身汉是你想要的行为,那么单身汉没有任何问题。当您实现一个单例时,只有一个全局变量,并且开始到处使用它们时,问题就出现了。(只是一个合理性检查)如果
JPanel
上有一个
JButton
位于
JFrame
上,如果我在
JButton
上调用此方法,它会返回
JFrame
?我想答案应该是肯定的,因为
JPanel
不是一个
窗口,但我想问问专家也没什么坏处D@mre:是的,它将返回顶层窗口,在您的情况下,该窗口将是JFrame。另请参阅+1用于指向
gWA()
-我当天的学习项目的指针。:)@mKorbel:谢谢你的帮助。我刚才已经+1你了。
Window[] allWindows = Window.getWindows();
Window[] allWindows = Window.getOwnedWindows();