使用多个jframe:好还是坏?

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

我只是想知道使用多个JFrame窗口是否是好的实践?

142366 次浏览

我只是想知道使用多个jframe是否是好的实践?

糟糕的做法。

  • 用户不友好:用户在任务栏中看到多个图标,而期望只看到一个图标。加上编码问题的副作用。
  • 编码和维护的噩梦:
    • 模态对话框提供了一个简单的机会将注意力集中在对话框的内容上-选择/修复/取消这个,然后继续。多帧则不然。
    • 当父对象被点击时,带有父对象的对话框(或浮动工具栏)将出现在前面——如果这是想要的行为,你必须在框架中实现它。
    • 李< / ul > < / >

    在一个GUI中显示多个元素的方法有很多,例如:

    • CardLayout(短演示。)。适合:
      1. 显示类似对话框的向导。
      2. 显示具有关联组件的项的列表、树等选择。
      3. 在没有组件和可见组件之间切换。
      4. 李< / ol > < / >
      5. # EYZ0 / # EYZ1通常用于MDI
      6. JTabbedPane用于组件组。
      7. 一种显示两个组件的方法,其中一个组件的重要性(大小)根据用户正在做的事情而变化。
      8. JLayeredPane far many well ..分层的组件。
      9. JToolBar通常包含操作或控件组。可以在GUI周围拖动,或完全根据用户需要将其删除。如上所述,将根据父进程的操作最小化/恢复。
      10. 作为JList中的项(下面的简单示例)。
      11. 作为JTree中的节点。
      12. # EYZ0。< br > < img src = " https://i.stack.imgur.com/Jaqap.png " >

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

    许多图片

    在这种情况下,多个元素都是图像,最好使用以下任何一种:

    1. 单个JLabel(位于滚动窗格的中心)显示用户当时感兴趣的任何图像。如在ImageViewer中所见。< br > < img src = " https://i.stack.imgur.com/5JXpC.gif " >
    2. 单行JList。如这个答案所示。“单行”部分只有在它们都是相同尺寸的情况下才有效。或者,如果你准备在飞行中缩放图像,并且它们都是相同的纵横比(例如4:3或16:9)。

    < img src = " https://i.stack.imgur.com/q8hEl.jpg " >

将jInternalFrame放入主框架中,并使其不可见。然后您可以将它用于进一步的事件。

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

绝对是坏习惯。一个原因是它不是很“用户友好”的事实,每个JFrame显示一个新的任务栏图标。控制多个# eyz0会让你抓狂。

就我个人而言,对于您这种类型的应用程序,我会使用one# EYZ0。显示多个东西的方法取决于你,有很多。Canvases, JInternalFrameCardLayout,甚至JPanels也有可能。

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

这是一段时间以来,我最后一次接触摇摆,但一般是一个坏的做法,这样做。我想到的一些主要缺点是:

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

  • 导航到一堆粘在一起的JFrame是不容易的,它看起来就像你的应用程序是一组不一致的应用程序和糟糕的设计。

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

自从我开始编写Swing应用程序以来,我就一直在实现多个JFrame方法。在大多数情况下,我一开始就这么做了,因为我不知道有什么更好的办法。然而,随着我作为一名开发人员的经验和知识的成熟,以及开始阅读和吸收网上许多更有经验的Java开发人员的意见,我试图从多个JFrame方法中转变(无论是在当前的项目中还是在未来的项目中),只遇到了……得到这个……当我开始实现模态对话框来控制“子”窗口和单独的组件时,我非常惊讶,因为我正在做我认为最好的实践!但是,正如他们所说,“一个幸福的妻子就是幸福的生活。”你的客户也一样。当然,我是一个承包商,所以我的终端用户可以直接访问我这个开发人员,这显然不是一个常见的场景。

因此,我将解释多种JFrame方法的好处,以及打破其他人提出的一些缺点。

  1. 布局极具灵活性 -通过允许单独的# eyz0,你可以让最终用户能够展开并控制他/她屏幕上的内容。这个概念感觉很“开放”,不受限制。当你面对一个大的JFrame和一堆# eyz2时,你就失去了这个。
  2. 适用于非常模块化的应用程序 -在我的例子中,我的大多数应用程序都有3 - 5个大的“模块”,它们彼此之间没有任何关系。例如,一个模块可能是销售仪表板,另一个可能是会计仪表板。他们彼此都不说话。但是,执行人员可能希望同时打开这两个框架,并且它们是任务栏上的独立框架,这使他的工作更容易。
  3. 曾经,我遇到过这样的情况:我的应用程序有一个“数据查看器”,从中你可以点击“添加新”,它会打开一个数据输入屏幕。最初,它们都是# eyz0。但是,我希望数据输入屏幕是JDialog,它的父节点是数据查看器。我做了更改,然后马上接到了一个终端用户的电话,他非常依赖这样一个事实:当他引用程序的另一部分(或者一个网站,我不记得了)时,他可以最小化或关闭查看器,并保持编辑器打开。他在多显示器上是,所以他需要输入对话框是第一个,其他的东西是第二个,数据查看器完全隐藏。这对于JDialog是不可能的,对于JInternalFrame也是不可能的。为了他的理智,我不情愿地把它改回单独JFrames,但这给了我一个重要的教训。
  4. 根据我的经验,这是不正确的。我不明白为什么创建JInternalFrame会比创建JFrame更容易。事实上,根据我的经验,JInternalFrames提供的灵活性要小得多。我已经形成了一套系统的处理开口的方法。关闭JFrames在我的应用程序,真的很好。我几乎完全从帧的代码本身控制帧;新帧的创建,SwingWorkers控制后台线程的数据检索和EDT上的GUI代码,如果用户尝试打开两次,则恢复/带到帧的前面,等等。所有你需要打开我的JFrames是调用一个公共静态方法open()和打开方法,结合一个windowClosing()事件处理剩下的(帧已经打开了吗?不是开的,是装的吗?等)我把这个方法做成了一个模板,这样对每一帧都不难实现。
  5. 误解/未经证实:资源密集型 -我想看看这个推测性陈述背后的一些事实。虽然,也许您可以说JFrameJInternalFrame需要更多的空间,但即使您打开100个JFrame,您实际会消耗多少资源呢?如果您担心的是由于资源导致的内存泄漏:调用dispose()将释放框架用于垃圾收集的所有资源(我再次强调,JInternalFrame应该调用完全相同的问题)。

我写了很多,我觉得我还能写更多。不管怎样,我希望我不会因为这是一个不受欢迎的观点而被否决。这个问题显然很有价值,我希望我提供了一个有价值的答案,即使它不是普遍的观点。

多帧/每帧一个文档(SDI) vs单帧/每帧多个文档(MDI)的一个很好的例子是Microsoft Excel。MDI的一些好处:

  • 可以有一些非矩形形状的窗口-这样它们就不会对其他进程(例如web浏览器)隐藏桌面或其他窗口。
  • 这是可能的,从另一个进程在一个Excel窗口中打开一个窗口,同时在第二个Excel窗口中写入-使用MDI,尝试在一个内部窗口中写入将把焦点集中到整个Excel窗口,因此隐藏窗口从另一个进程
  • 在不同的屏幕上可以有不同的文档,这在屏幕没有相同分辨率时特别有用

SDI (single - document Interface,即每个窗口只能有一个文档):

enter image description here

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

enter image description here

我想用一个我刚刚涉及到的例子来反驳“不友好”的论点。

在我们的应用程序中,我们有一个主窗口,用户在其中运行不同的“程序”作为单独的选项卡。我们已经尽可能地将应用程序保持在这个单一窗口中。

他们运行的一个“程序”显示了系统生成的报告列表,用户可以单击每行上的图标弹出一个报告查看器对话框。这个查看器显示的内容相当于报告的A4页,所以用户喜欢这个窗口非常大,几乎填满了他们的屏幕。

几个月前,我们开始收到客户的请求,要求将这些报表查看器窗口变成非模态的,这样他们就可以同时打开多个报表。

有一段时间,我拒绝了这个要求,因为我认为这不是一个好的解决方案。然而,当我发现用户如何绕过我们系统的“缺陷”时,我的想法改变了。

他们打开一个查看器,使用“另存为”功能将报告保存为PDF文件到特定目录,使用Acrobat Reader打开PDF文件,然后他们会对下一个报告做同样的操作。他们将使用多个Acrobat reader运行他们想要查看的各种报告输出。

所以我妥协了,让观众变得无模态。这意味着每个查看器都有一个任务栏图标。

上周,当最新版本发布给他们时,他们压倒性的反应是他们喜欢它。这是我们最近对系统最受欢迎的改进之一。

所以你继续告诉你的用户,他们想要的东西是不好的,但最终它不会给你任何好处。

一些注意事项:

  • 对于这些非模态窗口,使用JDialog似乎是最佳实践
  • 使用使用新ModalityType而不是boolean参数modal的构造函数。这就是为这些对话框提供任务栏图标的原因。
  • 对于非模态对话框,向构造函数传递一个空的父窗口,但定位它们相对于它们的“父”窗口。
  • Windows上的Java版本6有一个错误,这意味着你的主窗口可以在你不告诉它的情况下变得“总是在顶部”。升级到版本7可以解决这个问题

如果这两个帧的大小是相同的,为什么不创建一个帧,然后把它作为引用传递给它呢?

当你通过这个框架时,你可以决定如何填充它。这就像有了一种计算一组数字平均值的方法。你会一遍又一遍地创建这个方法吗?

这不是一个好的实践,但即使你希望使用它,你也可以使用单例模式。我在我的大部分项目中都使用了单例模式,这很好。

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

相反,我们可以在同一个JFrame中使用JPanels而不是一个或多个JPanel

我们也可以在JPanels之间切换。所以它给了我们在JFrame中显示更多东西的自由。

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

要在# eyz0之间切换,请使用JMenuBarJMenuItems为每个# eyz0或'JButtonfor eachJPanel '。

多于一个JFrame并不是一个好的实践,但是如果我们想要多于一个JFrame也没有错。

但是根据我们不同的需求改变一个JFrame比有多个JFrame更好。