多个JFrames的使用:好还是坏的实践?

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

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


我只是想知道使用多个JFrames是否是好的做法?

坏(坏,坏)的做法。

  • 用户不友好:当期望只看到一个时,用户在其任务栏中看到多个图标。 再加上编码问题的副作用..
  • 编码和维护的噩梦:
  • 模式对话框提供了将注意力集中在对话内容上的便利机会 - 选择/修复/取消此对话框, 然后继续。 多帧不。
  • 当父母被点击时,带有父母的对话框(或浮动工具栏)会出现在前面 - 如果这是所需的行为,您必须在框架中实现该对话框。

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

  • CardLayout (简短演示)。 适用于:
  • 显示类似向导的对话框。
  • 显示具有关联组件的项目的列表,树等选项。
  • 在没有组件和可见组件之间翻转。
  • JInternalFrame / JDesktopPane通常用于MDI。
  • JTabbedPane用于组件组。
  • JSplitPane显示其中一个或另一个(大小)之间的重要性根据用户的行为而变化的两个组件的方式。
  • JLayeredPane很多很好的层状组件。
  • JToolBar通常包含一组操作或控件。 可以在GUI上拖动,或根据用户需要完全关闭它。 如上所述,根据父母这样做将最小化/恢复。
  • 作为JList项目(下面的简单示例)。
  • 作为JTree节点。
  • 嵌套布局。
  • 但是,如果这些策略不适用于特定用例,请尝试以下操作。 建立一个主JFrame ,然后为其余的自由浮动元素显示JDialogJOptionPane实例,使用框架作为对话框的父对象。

    许多图像

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

  • 单个JLabel (以滚动窗格为中心)显示用户当时感兴趣的图像。 在ImageViewer可以看到。
  • 单行JList 。 正如在这个答案中所见。 只有它们具有相同的尺寸时,“单行”部分才有效。 或者,如果您准备随时缩放图像,并且它们的纵横比都是相同的(例如4:3或16:9),

  • 自从我开始编写Swing应用程序以来,多种JFrame方法已经实现。 在大多数情况下,我在一开始就这样做了,因为我不知道更好。 然而 ,正如我成熟了,我的经验和知识作为开发人员和开始阅读和在线吸收那么多的有经验的Java开发者的意见,我做出了尝试从多个转移开 JFrame方法(无论是在当前的项目和未来项目)只会遇到......得到这个......来自我的客户的抵制! 当我开始实施模态对话框来控制单独组件的“子”窗口和JInternalFrame我的客户开始抱怨! 我很惊讶,因为我正在做我认为最好的练习! 但是,正如他们所说,“幸福的妻子是幸福的生活。” 您的客户也一样。 当然,我是一个承包商,所以我的最终用户可以直接访问我,这个开发人员,这显然不是一个常见的情况。

    因此,我将解释多种JFrame方法的好处,以及神话 - 突破其他人提出的一些弊端。

  • 最大的布局灵活性 - 通过允许单独的JFrame ,您可以让最终用户分散和控制他/她屏幕上的内容。 这个概念感觉“开放”和非狭隘。 当你走向一个大的JFrame和一堆JInternalFrame时,你会失去它。
  • 适用于非常模块化的应用程序 - 在我的情况下,我的大多数应用程序都有3-5个大的“模块”,这些模块实际上无关。 例如,一个模块可能是一个销售仪表板,一个模块可能是一个会计仪表板。 他们不相互交谈或任何事情。 然而,执行官可能想要打开他们,他们是任务栏上的单独框架使他的生活更轻松。
  • 使最终用户可以轻松引用外部材料 - 曾经,我遇到过这种情况:我的应用程序有一个“数据查看器”,您可以从中单击“添加新的”,并打开数据输入屏幕。 最初,两者都是JFrame 。 但是,我希望数据输入屏幕是一个JDialog其父母是数据查看器。 我作出了改变,并立即收到了一位最终用户的电话,他最终依赖于他可以最大限度地减少或关闭观看者,并在编辑另一部分节目(或一个网站,不记得)。 他不在一个多显示器上,所以他需要输入对话框是第一位的,而其他的则是第二位,数据查看器完全隐藏。 这对于一个JDialog来说是不可能的,对于一个JInternalFrame也是不可能的。 为了他的理智,我勉强地将它改回为单独的JFrames ,但它教会了我一个重要的教训。
  • 神话:难以编码 - 根据我的经验,这不是真的。 我不明白为什么创建JInternalFrameJFrame更容易。 事实上,根据我的经验, JInternalFrames提供的灵活性要低得多。 我开发了一套系统的方式来处理我的应用程序中打开和关闭JFrame的功能,这些功能确实很好。 我几乎完全从帧的代码本身控制帧; 新框架的创建, SwingWorker控制后台线程上的数据检索以及EDT上的GUI代码,如果用户试图打开它两次,还原/引入框架等等。所有您需要打开我的JFrame s是调用一个公共的静态方法open()和open方法,再加上一个windowClosing()事件处理剩下的部分(框架是否已经打开?是不是打开,但加载?等)我使这个方法成为一个模板每帧实现并不困难。
  • 神话/未经证实:资源沉重 - 我希望看到这一推测性陈述背后的一些事实。 虽然也许你可以说JFrame需要比JInternalFrame更多的空间,即使你打开了100个JFrame ,你真的会消耗多少资源? 如果你的担心是由于资源引起的内存泄漏:调用dispose()释放该帧用于垃圾收集的所有资源(并且,我再说一次JInternalFrame应该调用完全相同的关注点)。
  • 我写了很多,我觉得我可以写更多。 无论如何,我希望我不会因为这是一个不受欢迎的意见而被低估。 这个问题显然是一个很有价值的问题,我希望我能提供一个有价值的答案,即使这不是普遍的观点。

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

  • 有可能有几个非矩形的窗口 - 因此它们不会隐藏桌面或其他窗口(例如Web浏览器)
  • 可以在另一个Excel窗口中打开另一个窗口,同时在第二个Excel窗口中写入 - 使用MDI,尝试在其中一个内部窗口中写入将使整个Excel窗口成为焦点,从而隐藏另一个进程的窗口
  • 可以在不同的屏幕上显示不同的文档,这在屏幕分辨率不同时特别有用
  • SDI(单文档界面,即每个窗口只能有一个文档):

    在这里输入图像描述

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

    在这里输入图像描述


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

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

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

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

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

    他们打开一个查看器,使用“另存为”工具将报告保存为PDF到指定的目录,使用Acrobat Reader打开PDF文件,然后他们将与下一个报告一样。 他们将有多个Acrobat Reader与他们想要查看的各种报告输出一起运行。

    于是我松了口气,让观众变得模糊不清。 这意味着每个查看器都有一个任务栏图标。

    当最新版本上周发布给他们时,他们热烈的回应是他们喜欢它。 这是我们最近最受欢迎的系统增强之一。

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

    一些注意事项:

  • 在这些无模式窗口中使用JDialog似乎是最佳实践
  • 使用使用新的ModalityType而不是布尔modal参数的构造函数。 这就是这些对话框的任务栏图标。
  • 对于无模式对话框,将一个空的父对象传递给构造函数,但是找到它们相对于它们的“父”窗口。
  • Windows上的Java版本6有一个错误,这意味着您的主窗口可能会变成“始终处于顶层”而不会告诉它。 升级到版本7来解决这个问题
  • 链接地址: http://www.djcxy.com/p/58237.html

    上一篇: The Use of Multiple JFrames: Good or Bad Practice?

    下一篇: Why is there no logical xor in JavaScript?