多个JFrames的使用:好还是坏的实践?
我正在开发一个显示图像的应用程序,并从数据库播放声音。 我试图决定是否使用单独的JFrame从GUI添加图像到数据库。
我只是想知道是否使用多个JFrame窗口是好的做法?
我只是想知道使用多个JFrames是否是好的做法?
坏(坏,坏)的做法。
在一个GUI中显示许多元素的方法有很多种,例如:
CardLayout
(简短演示)。 适用于: JInternalFrame
/ JDesktopPane
通常用于MDI。 JTabbedPane
用于组件组。 JSplitPane
显示其中一个或另一个(大小)之间的重要性根据用户的行为而变化的两个组件的方式。 JLayeredPane
很多很好的层状组件。 JToolBar
通常包含一组操作或控件。 可以在GUI上拖动,或根据用户需要完全关闭它。 如上所述,根据父母这样做将最小化/恢复。 JList
项目(下面的简单示例)。 JTree
节点。 但是,如果这些策略不适用于特定用例,请尝试以下操作。 建立一个主JFrame
,然后为其余的自由浮动元素显示JDialog
或JOptionPane
实例,使用框架作为对话框的父对象。
许多图像
在这种情况下,多个元素是图像,最好使用以下两种方法之一:
JLabel
(以滚动窗格为中心)显示用户当时感兴趣的图像。 在ImageViewer
可以看到。 JList
。 正如在这个答案中所见。 只有它们具有相同的尺寸时,“单行”部分才有效。 或者,如果您准备随时缩放图像,并且它们的纵横比都是相同的(例如4:3或16:9), 自从我开始编写Swing应用程序以来,多种JFrame
方法已经实现。 在大多数情况下,我在一开始就这样做了,因为我不知道更好。 然而 ,正如我成熟了,我的经验和知识作为开发人员和开始阅读和在线吸收那么多的有经验的Java开发者的意见,我做出了尝试从多个转移开 JFrame
方法(无论是在当前的项目和未来项目)只会遇到......得到这个......来自我的客户的抵制! 当我开始实施模态对话框来控制单独组件的“子”窗口和JInternalFrame
, 我的客户开始抱怨! 我很惊讶,因为我正在做我认为最好的练习! 但是,正如他们所说,“幸福的妻子是幸福的生活。” 您的客户也一样。 当然,我是一个承包商,所以我的最终用户可以直接访问我,这个开发人员,这显然不是一个常见的情况。
因此,我将解释多种JFrame
方法的好处,以及神话 - 突破其他人提出的一些弊端。
JFrame
,您可以让最终用户分散和控制他/她屏幕上的内容。 这个概念感觉“开放”和非狭隘。 当你走向一个大的JFrame
和一堆JInternalFrame
时,你会失去它。 JFrame
。 但是,我希望数据输入屏幕是一个JDialog
其父母是数据查看器。 我作出了改变,并立即收到了一位最终用户的电话,他最终依赖于他可以最大限度地减少或关闭观看者,并在编辑另一部分节目(或一个网站,不记得)。 他不在一个多显示器上,所以他需要输入对话框是第一位的,而其他的则是第二位,数据查看器完全隐藏。 这对于一个JDialog
来说是不可能的,对于一个JInternalFrame
也是不可能的。 为了他的理智,我勉强地将它改回为单独的JFrames
,但它教会了我一个重要的教训。 JInternalFrame
比JFrame
更容易。 事实上,根据我的经验, JInternalFrames
提供的灵活性要低得多。 我开发了一套系统的方式来处理我的应用程序中打开和关闭JFrame
的功能,这些功能确实很好。 我几乎完全从帧的代码本身控制帧; 新框架的创建, SwingWorker
控制后台线程上的数据检索以及EDT上的GUI代码,如果用户试图打开它两次,还原/引入框架等等。所有您需要打开我的JFrame
s是调用一个公共的静态方法open()
和open方法,再加上一个windowClosing()
事件处理剩下的部分(框架是否已经打开?是不是打开,但加载?等)我使这个方法成为一个模板每帧实现并不困难。 JFrame
需要比JInternalFrame
更多的空间,即使你打开了100个JFrame
,你真的会消耗多少资源? 如果你的担心是由于资源引起的内存泄漏:调用dispose()
释放该帧用于垃圾收集的所有资源(并且,我再说一次JInternalFrame
应该调用完全相同的关注点)。 我写了很多,我觉得我可以写更多。 无论如何,我希望我不会因为这是一个不受欢迎的意见而被低估。 这个问题显然是一个很有价值的问题,我希望我能提供一个有价值的答案,即使这不是普遍的观点。
一个很好的例子是多帧/单帧文件(SDI)与单帧/多帧文件(MDI)是Microsoft Excel。 一些MDI的好处:
SDI(单文档界面,即每个窗口只能有一个文档):
MDI(多文档界面,即每个窗口可以有多个文档):
我想用我刚刚参与的一个例子来反驳“不友好”的论点。
在我们的应用程序中,我们有一个主窗口,用户将各种“程序”作为单独的选项卡运行。 尽可能多地尝试将我们的应用程序保留在这个窗口中。
他们运行的一个“程序”提供了系统生成的报告列表,用户可以点击每行的图标弹出打开报告查看器对话框。 此查看器显示的报告的纵向/横向A4页面等效,所以像这个窗口的用户相当大,几乎填满了他们的屏幕。
几个月前,我们开始收到客户的要求,使这些报告查看器窗口无模式,以便他们可以同时打开多个报告。
有一段时间我拒绝了这个要求,因为我认为这不是一个好的解决方案。 然而,当我发现用户如何解决我们系统的这个“缺陷”时,我的想法发生了变化。
他们打开一个查看器,使用“另存为”工具将报告保存为PDF到指定的目录,使用Acrobat Reader打开PDF文件,然后他们将与下一个报告一样。 他们将有多个Acrobat Reader与他们想要查看的各种报告输出一起运行。
于是我松了口气,让观众变得模糊不清。 这意味着每个查看器都有一个任务栏图标。
当最新版本上周发布给他们时,他们热烈的回应是他们喜欢它。 这是我们最近最受欢迎的系统增强之一。
所以你继续告诉你的用户他们想要的东西不好,但最终它不会对你有任何好处。
一些注意事项:
ModalityType
而不是布尔modal
参数的构造函数。 这就是这些对话框的任务栏图标。