多个JFrame的使用:好的还是坏的做法?

时间:2012-03-04 11:53:40

标签: java swing user-interface jframe

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

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

9 个答案:

答案 0 :(得分:435)

  

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

糟糕(坏,坏)的做法。

  • 用户不友好:当期望只看到一个时,用户会在任务栏中看到多个图标。再加上编码问题的副作用..
  • 编码和维护的噩梦:
    • modal dialog提供了将注意力集中在该对话框内容上的简单机会 - 选择/修复/取消此选项,然后继续。多个框架没有。
    • 当单击父级时,带有父级的对话框(或浮动工具栏)将显示在前面 - 如果这是期望的行为,则必须在框架中实现它。

在一个GUI中可以使用多种方式显示多个元素,例如:

  • CardLayout(简demo.)。适用于:
    1. 显示类似对话框的向导。
    2. 显示具有关联组件的项目的列表,树等选择。
    3. 在没有组件和可见组件之间翻转。
  • JInternalFrame/JDesktopPane通常用于MDI
  • JTabbedPane用于组件组。
  • JSplitPane一种显示两个组件的方法,其中一个或另一个组件(大小)之间的重要性因用户的行为而异。
  • JLayeredPane很多很好的..层次组件。
  • JToolBar通常包含一组操作或控件。可以在GUI周围拖动,也可以根据用户需要完全关闭。如上所述,将根据父母这样做最小化/恢复。
  • 作为JList中的项目(下面的简单示例)。
  • 作为JTree
  • 中的节点
  • Nested layouts。{
    {0}}

但是,如果这些策略不适用于特定用例,请尝试以下操作。建立单个主JFrame,然后为剩余的自由浮动元素显示JDialogJOptionPane实例,使用框架作为对话框的父级。

许多图片

在多个元素是图像的情况下,最好使用以下任一项:

  1. 单个JLabel(以滚动窗格为中心),以显示用户当时感兴趣的任何图像。如ImageViewer
  2. 中所示
  3. 单行JList。如this answer中所示。它的“单行”部分只有在它们具有相同尺寸时才有效。或者,如果您准备在运行中缩放图像,它们都具有相同的宽高比(例如4:3或16:9)。

答案 1 :(得分:197)

自从我开始编写Swing应用程序以来,我已经实现了多种JFrame方法。在大多数情况下,我在一开始就这样做,因为我不知道更好。 然而,随着我作为开发人员的经验和知识的成熟,以及开始阅读和吸收更多经验丰富的Java开发人员的意见,我试图转移 strong>来自多个JFrame方法(在当前项目和未来的项目中)只能满足...得到这个... 来自我的客户的抵抗!当我开始实施模态对话框来控制孩子" Windows和JInternalFrame用于单独的组件,我的客户开始抱怨!我很惊讶,因为我正在做我认为最好的练习!但是,正如他们所说,"幸福的妻子是幸福的生活。"同样适用于您的客户。当然,我是承包商,所以我的最终用户可以直接访问我,开发人员,这显然不是常见的情况。

所以,我将解释多重JFrame方法的好处,以及其他人提出的一些弊端。

  1. 布局的最大灵活性 - 通过允许单独的JFrame,您可以让最终用户分散和控制他/她的屏幕上的内容。这个概念感觉"开放"和非限制性的。当你走向一个大的JFrame和一堆JInternalFrame s。
  2. 时,你会失去这个
  3. 适用于非常模块化的应用程序 - 在我的情况下,我的大多数应用程序都有3-5个大型模块和#34;这真的与彼此毫无关系。例如,一个模块可能是销售仪表板,一个可能是会计仪表板。他们不会互相交谈或任何事情。但是,执行官可能想要打开这两个,并且他们在任务栏上的独立框架使他的生活更轻松。
  4. 让最终用户轻松引用外部资料 - 有一次,我有这样的情况:我的应用程序有一个"数据查看器,"您可以点击"添加新的"它会打开一个数据输入屏幕。最初,两者都是JFrame s。但是,我希望数据输入屏幕是JDialog,其父级是数据查看器。我做了更改,并立即收到了最终用户的电话,最终用户严重依赖于他可以最小化或关闭查看器并保持编辑器打开他引用了该计划的另一部分(或者一个网站,我不记得)。他在多显示器上,因此他需要输入对话框成为第一个,别的成为第二个,数据查看器完全隐藏。使用JDialog这是不可能的,而JInternalFrame也不可能。我不情愿地将它改回到单独的JFrames,因为他的理智,但它教会了我一个重要的教训。
  5. 神话:难以编码 - 根据我的经验,这不是真的。我不明白为什么创建JInternalFrame比创建JFrame更容易。事实上,根据我的经验,JInternalFrames提供的灵活性要低得多。我已经开发出一种处理开放性的系统方法。在我的应用中关闭JFrame,这真的很有效。我几乎完全从框架代码本身内控制框架;创建新框架SwingWorker,控制后台线程上的数据检索和EDT上的GUI代码,如果用户试图打开它,则恢复/带到框架前面等等。所有你需要的打开我的JFrame是调用一个公共静态方法open()和open方法,结合一个windowClosing()事件处理剩下的(框架是否已经打开?是不是打开了,但是我这个方法是一个模板,所以每个框架都不难实现。
  6. 神话/未经证实:资源严重 - 我希望看到这一推测性陈述背后的一些事实。虽然,也许你可以说JFrame需要的空间比JInternalFrame更多,即使你打开了100 JFrame,你真的会消耗多少资源?如果由于资源问题导致内存泄漏:调用dispose()释放框架用于垃圾收集的所有资源(并且,我再说一句,JInternalFrame应该调用完全相同的问题)。
  7. 我写了很多,我觉得我可以写得更多。无论如何,我希望我不会因为这是一个不受欢迎的意见而不能投票。这个问题显然是一个有价值的问题,我希望我提供了一个有价值的答案,即使它不是常见的意见。

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

    • 可能有一些非矩形的窗口 - 因此他们不会将桌面或其他窗口隐藏在其他进程中(例如网页浏览器)
    • 可以在第二个Excel窗口中写入时通过一个Excel窗口从另一个进程打开一个窗口 - 使用MDI,尝试在其中一个内部窗口中写入将聚焦到整个Excel窗口,从而隐藏另一个进程的窗口
    • 可以在不同的屏幕上显示不同的文档,这在屏幕分辨率不同时特别有用

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

    enter image description here

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

    enter image description here

答案 2 :(得分:50)

我想用我刚刚参与的一个例子来反驳“非用户友好”的论点。

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

他们运行的“程序”之一提供了系统生成的报告列表,用户可以单击每行上的图标弹出打开报告查看器对话框。此查看器显示相当于报告的纵向/横向A4页面,因此像这个窗口的用户非常大,几乎填满了他们的屏幕。

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

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

他们正在打开一个查看器,使用“另存为”工具将报告作为PDF保存到特定目录,使用Acrobat Reader打开PDF文件,然后他们将对下一个报告执行相同操作。他们将使用他们想要查看的各种报告输出运行多个Acrobat Readers。

所以我心软了,让观众无模式。这意味着每个查看者都有一个任务栏图标。

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

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

一些注意事项:

  • 对于这些无模式窗口,使用JDialog似乎是最佳实践
  • 使用使用新ModalityType而不是布尔modal参数的构造函数。这就是为这些对话框提供任务栏图标的原因。
  • 对于无模式对话框,将null父项传递给构造函数,但相对于其“父”窗口定位它们。
  • Windows上的Java版本6有一个bug,这意味着您的主窗口可以在不告诉您的情况下变得“永远在线”。升级到版本7以解决此问题

答案 3 :(得分:19)

将jInternalFrame设置为主框架并使其不可见。然后你可以用它来进行更多的活动。

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

答案 4 :(得分:18)

自从我最后一次接触挥杆以来已经有一段时间了,但总的来说这是一个不好的做法。想到的一些主要缺点:

  • 它更贵:你必须分配更多资源来绘制其他类型窗口容器的JFrame,例如Dialog或JInternalFrame。

  • 用户不友好:导航到一堆粘在一起的JFrame并不容易,看起来你的应用程序是一组不一致且设计不佳的应用程序。

  • 这很容易使用JInternalFrame 这是一种修辞,现在它比我们通过Desktop和JInternalFrame模式更容易和其他人更聪明(或者有更多的业余时间) ,所以我建议使用它。

答案 5 :(得分:10)

绝对不好练习。一个原因是,每个JFrame显示一个新的任务栏图标,这不是“用户友好”。控制多个JFrame会让你脱掉头发。

就个人而言,我会使用一个JFrame作为您的申请。显示多个事物的方法取决于你,有很多。 Canvas es,JInternalFrameCardLayout,甚至JPanel可能。

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

答案 6 :(得分:7)

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

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

我们也可以在JPanel之间切换。因此,我们可以自由地在JFrame中显示更多内容。

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

要针对每个JPanel或'JButton JMenuBar JPanel`,JMenuItems使用JPanelfor each进行切换。

不止一个JFrame不是一个好习惯,但如果我们想要多个JFrame则没有错。

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

答案 7 :(得分:5)

如果帧的大小相同,为什么不创建帧并传递帧然后作为对它的引用。

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

答案 8 :(得分:4)

这不是一个好习惯,但即使你想使用它,你也可以使用单身模式作为它的优点。我在项目的大部分时间里都使用了单例模式。