问题:使用多个JFrame:好的还是不好的做法?

我正在开发一个显示图像并播放数据库声音的应用程序。我正在尝试确定是否使用单独的JFrame从GUI向数据库添加图像。

我只是想知道使用多个JFrame窗口是否是一种好习惯?

标签:java,swing,user-interface,jframe

回答1:

我只是想知道使用多个JFrame是否是一种好习惯?

坏习惯(坏习惯)。

  • 用户不友好:用户只希望看到一个图标时,会在任务栏中看到多个图标。加上编码问题的副作用。
  • 编写和维护代码的噩梦:
    • 模式对话框提供了轻松的机会来集中注意力在该对话框的内容上-选择/修复/取消该对话框,然后继续。多帧不会。
    • 单击父级时,带有父级的对话框(或浮动工具栏)将显示在最前面-如果需要这样做,则必须在框架中实现。

有多种方法可以在一个GUI中显示许多元素,例如:

但是,如果这些策略不适用于特定用例,请尝试以下方法。建立单个主JFrame,然后具有 JDialog JOptionPane 实例出现在其余自由浮动元素上,并使用框架作为对话框的父级。

许多图片

在这种情况下,如果多个元素是图像,则最好使用以下两种方法之一:

  1. 单个JLabel(位于滚动窗格的中央),以显示当时用户感兴趣的图像。如 ImageViewer 所示。
  2. 单行JList。如此答案所示。只有它们的尺寸相同时,"单行"部分才有效。或者,如果您准备即时缩放图像,并且它们的长宽比都相同(例如4:3或16:9)。

回答2:

自从我开始对Swing应用程序进行编程以来,我已经实现了多种JFrame方法。在大多数情况下,我在一开始就这样做了,因为我没有更好的了解。 但是,随着我作为开发人员的经验和知识日渐成熟,并开始在线阅读和吸收更多经验丰富的Java开发人员的意见,我尝试离开来自多个JFrame方法(在当前项目和将来的项目中)的" strong>"仅适用于...得到此...来自客户的抵抗力!开始实现模态对话框来控制"子"窗口和单独组件的JInternalFrame我的客户开始抱怨!我很惊讶,因为我在做我想做的事情最佳实践!但是,正如他们所说,"幸福的妻子就是幸福的生活"。您的客户也一样。当然,我是承包商,因此最终用户可以直接与我(开发人员)联系,这显然不是常见情况。

因此,我将解释采用多种JFrame方法的好处,以及神话般地破坏了其他人提出的一些弊端。

  1. 最大的版面灵活性-通过允许单独的JFrame,您可以使最终用户能够分散并控制其屏幕上的内容。该概念感到"开放"且不受限制。当您走向一个大的JFrame和一堆JInternalFrame s时,就会丢失此信息。
  2. 非常适合模块化的应用程序-就我而言,我的大多数应用程序都具有3-5个大的"模块",它们实际上彼此之间没有任何关系。例如,一个模块可能是销售仪表板,而一个模块可能是会计仪表板。他们不互相交谈或任何东西。但是,主管可能想同时打开它们,并且它们在任务栏上是单独的框架,这使他的生活更轻松。
  3. 使最终用户可以轻松参考外部材料-一次,我遇到了这种情况:我的应用有一个"数据查看器",您可以从中单击"添加新内容",然后打开数据输入屏幕。最初,两者都是JFrame。但是,我希望数据输入屏幕是一个JDialog,其父级是数据查看器。我进行了更改,然后立即收到来自最终用户的电话,该用户在很大程度上依赖于他可以最小化或关闭查看器并使编辑器打开的事实。他引用了程序的另一部分(或者我不记得一个网站)。他不是在多显示器上,因此他需要输入对话框为第一,而其他为第二,而数据查看器则完全隐藏。对于JDialog,这是不可能的,对于JInternalFrame,这当然也是不可能的。由于他的理智,我勉强将其改回为单独的JFrames,但它教会了我一个重要的教训。
  4. 神话:难以编码-根据我的经验,这不是事实。我不明白为什么创建一个JInternalFrame比创建JFrame会容易得多。实际上,以我的经验,JInternalFrames提供的灵活性要差得多。我已经开发出一种系统的方法来处理我的应用程序中JFrame的打开和关闭,这确实很好。我几乎完全从框架代码本身内控制框架。创建新框架,即SwingWorker,该框架控制后台线程上的数据检索以及EDT上的GUI代码,如果用户尝试将其打开两次,则将其还原/带到该框架的前面,等等。打开我的JFrame所需要的就是调用一个公共静态方法open()和open方法,并结合一个windowClosing()事件处理其余部分(框架已经打开了吗?它没有打开,但是正在加载吗?等),我将此方法用作模板,因此对于每个框架都很难实现。
  5. 神话/未经证实:资源丰富-我想看看这个推测性陈述背后的一些事实。尽管也许可以说JFrameJInternalFrame需要更多空间,但是即使您打开100个JFrame,也有多少资源你真的会消费吗?如果您担心的是由于资源导致的内存泄漏:调用dispose()会释放该帧用于垃圾回收的所有资源(我再次说,JInternalFrame应该完全调用同样的关注。)

我写了很多书,我觉得我可以写更多。无论如何,我希望我不要因为它是一个不受欢迎的观点而被否决。这个问题显然是一个有价值的问题,我希望我提供了一个有价值的答案,即使这不是普遍的看法。

每帧多个框架/单个文档( SDI )与一个帧/多个文档( MDI )是Microsoft Excel。 MDI的一些优点:

  • 可能有一些非矩形的窗口-因此它们不会在其他进程(例如网络浏览器)中隐藏桌面或其他窗口
  • 在第二个Excel窗口中写入时,可以在一个Excel窗口中从另一个进程打开一个窗口-使用MDI,尝试在其中一个内部窗口中写入将使整个Excel窗口都具有焦点,从而在另一个进程中隐藏窗口
  • 在不同的屏幕上可能会有不同的文档,这在屏幕分辨率不同的情况下尤其有用

SDI(单文档界面,即每个窗口只能有一个文档):

MDI(多文档界面,即每个窗口可以有多个文档):

回答3:

我想用我刚才涉及的一个例子来反驳"不友好用户"的说法。

在我们的应用程序中,我们有一个主窗口,用户可以在其中运行各种"程序"作为单独的选项卡。我们已尽可能尝试将应用程序保留在单个窗口中。

它们运行的​​"程序"之一显示了系统已生成的报告的列表,用户可以单击每行上的图标以弹出打开报告查看器对话框。该查看器正在显示与报告的纵向A4页面相同的图像,因此用户喜欢此窗口很大,几乎充满了他们的屏幕。

几个月前,我们开始收到客户的要求,以使这些报表查看器窗口变为无模式,以便他们可以同时打开多个报表。

一段时间以来,我拒绝了此请求,因为我认为这不是一个好的解决方案。但是,当我发现用户如何解决我们系统的这种"缺陷"时,我的想法改变了。

他们正在打开查看器,使用"另存为"功能将报告另存为PDF到特定目录,使用Acrobat Reader打开PDF文件,然后对下一个报告执行相同的操作。他们将拥有多个Acrobat Reader,并运行它们想要查看的各种报告输出。

因此,我放松了,并使查看器变得无模式。这意味着每个查看器都有一个任务栏图标。

上周向他们发布最新版本时,他们的压倒性反应是他们喜欢它。这是我们最近最流行的系统增强功能之一。

因此,您继续告诉用户他们想要的东西是不好的,但最终并不会给您带来任何好处。

一些注意事项:

  • 在这些无模式窗口中使用JDialog似乎是最佳实践
  • 使用使用新的ModalityType而不是布尔型modal参数的构造函数。这就是为这些对话框提供任务栏图标的原因。
  • 对于无模式对话框,请将空父级传递给构造函数,但要相对于其"父级"窗口定位它们。
  • Windows上的Java版本6有一个 bug ,这意味着您的主窗口可以始终顶",而无需您告诉。升级到版本7来解决此问题

回答4:

使jInternalFrame进入主框架并使其不可见。然后,您可以将其用于其他事件。

jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);

回答5:

自上次我接触秋千以来已经有一段时间了,但总的来说,这样做是一种不好的做法。想到的一些主要缺点:

  • 更昂贵::您将不得不分配更多的资源来绘制JFrame,而不是其他类型的窗口容器,例如Dialog或JInternalFrame。

  • 不友好:导航进入一堆粘在一起的JFrame并不容易,这看起来像您的应用程序是一组不一致且设计不良的应用程序。

  • 易于使用的JInternalFrame 这是一种反驳,现在比通过桌面和JInternalFrame模式我们已经认为的更容易,其他人也更聪明(或有更多的空闲时间) ,所以我建议使用它。

回答6:

绝对不正确的做法。一个原因是,由于每个JFrame都显示​​一个新的任务栏图标,因此它不是非常"用户友好"的。控制多个JFrame将使您脱颖而出。

我个人会为您的应用程序使用一个JFrame。显示多种事物的方法取决于您,有很多。 Canvas es,JInternalFrameCardLayout,甚至是JPanel

多个JFrame对象=痛苦,麻烦和问题。

回答7:

我认为使用多个Jframe不是一个好主意。

相反,我们可以在同一JFrame中使用JPanel的多个或多个JPanel

我们也可以在这些JPanel之间切换。因此,它使我们可以自由显示而不是在JFrame中的东西上显示。

对于每个JPanel,我们可以设计不同的东西,所有这些JPanel可以一次显示在单个JFrame上。

>

要在此JPanel之间切换,请对每个JPanel或'JButton 使用JMenuBarJMenuItems每个 JPanel`。

一个以上的JFrame不是一个好习惯,但是如果我们想要多个JFrame,这没有错。

但最好是根据我们的不同需求更改一个JFrame,而不要使用多个JFrame

回答8:

如果框架将具有相同的大小,为什么不创建框架并通过该框架,然后将其作为对其的引用。

通过框架后,您可以决定如何填充框架。就像拥有一种用于计算一组图形平均值的方法一样。您会一遍又一遍地创建该方法吗?

回答9:

这不是一个好习惯,但是即使您希望使用它,也可以使用单例模式。在我的大多数项目中,我都使用了单例模式。

回到顶部