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

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

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

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

坏(坏,坏)的做法。

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

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

  • CardLayout (简短演示 )。 适合:
    1. 显示像向导一样的向导。
    2. 显示具有关联组件的项目的列表,树等选项。
    3. 在没有组件和可见组件之间翻转。
  • JInternalFrame / JDesktopPane通常用于MDI 。
  • JTabbedPane用于组件组。
  • JSplitPane一种显示两个组件之间的重要性(大小)根据用户的行为而变化的方法。
  • JLayeredPane很多很好的层状组件。
  • JToolBar通常包含一组操作或控件。 可以在GUI上拖动,也可以根据用户需要完全closures。 如上所述,根据这样做的父母将最小化/恢复。
  • 作为JList项目(下面的简单示例)。
  • 作为JTree节点。
  • 嵌套的布局 。

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

许多图像

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

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

自从我开始编写Swing应用程序以来,我已经实现了多个JFrame方法。 在大多数情况下,我是从一开始就这样做的,因为我不知道更好。 然而 ,随着我作为一名开发人员的经验和知识成熟起来,并开始阅读和吸收如此多经验丰富的Java开发人员的意见,我试图从多种JFrame方法(在当前项目和未来项目)只有遇到…得到这个… 来自我的客户的抵制! 当我开始实现modal dialog来控制“子”窗口和JInternalFrame的单独组件时, 我的客户开始抱怨! 我很惊讶,因为我正在做我认为是最好的练习! 但是,正如他们所说,“幸福的妻子是幸福的生活”。 你的客户也一样。 当然,我是一个承包商,所以我的terminal用户可以直接访问我这个开发人员,这显然不是一个普遍的情况。

所以,我要解释多个JFrame方法的好处,以及神话 – 破坏其他人提出的一些弊端。

  1. 最大的布局灵活性 – 通过允许单独的JFrame ,您可以让最终用户分散和控制他/她的屏幕上的内容。 这个概念感觉“开放”和不收缩。 当你走向一个大的JFrame和一堆JInternalFrame时,你会失去这个东西。
  2. 适用于非常模块化的应用程序 – 在我的情况下,我的大多数应用程序都有3-5个大的“模块”,这些模块确实没有任何关系。 例如,一个模块可能是一个销售仪表板,一个模块可能是一个会计仪表板。 他们不相互交谈或任何事情。 然而,执行官可能想要打开他们和他们在任务栏上的单独框架使他的生活更容易。
  3. 使最终用户能够轻松引用外部材料 – 曾经有这样的情况:我的应用程序有一个“数据查看器”,您可以从中单击“添加新的”,它将打开一个数据input屏幕。 最初,两者都是JFrame 。 但是,我希望数据input屏幕是一个JDialog其父母是数据查看器。 我做了这个改变,我立即接到了一个最终用户的电话,他最终依赖于他能够最小化或者closures观众,并且让编辑打开,而他引用另一部分节目(或者一个网站,不记得)。 他不在一个多显示器上,所以他需要input对话框是第一位的, 而其他的数据是完全隐藏的。 这对于一个JDialog是不可能的,而且对于一个JInternalFrame也是不可能的。 为了他的理智,我勉强地把它改回为单独的JFrames ,但它教会了我一个重要的教训。
  4. 神话:难以编码 – 这不是我的经验。 我不明白为什么创build一个JInternalFrameJFrame更容易。 事实上,根据我的经验, JInternalFrames提供的灵活性要less得多。 我开发了一个系统的方式来处理在我的应用程序中打开和closuresJFrame ,这真的很好。 我几乎完全从帧的代码本身控制帧; 创build新的框架, SwingWorker控制在后台线程上的数据检索和EDT上的GUI代码,如果用户试图打开它两次,恢复/带到框架前等。所有你需要打开我的JFrame s是调用一个公共的静态方法open()和open方法,再加上一个windowClosing()事件处理剩下的部分(就是框架已经打开了吗?是不是打开了,但是加载?等等)我把这个方法做成了一个模板每个框架都不难实现。
  5. 神话/未经证实:资源沉重 – 我想看看这个推测性陈述背后的一些事实。 虽然也许你可以说JFrameJInternalFrame需要更多的空间,即使你打开了100个JFrame ,你真的会消耗多less资源? 如果你的担心是由于资源的内存泄漏:调用dispose()释放框架使用的垃圾收集的所有资源(并且,我再说一次, JInternalFrame应该调用完全相同的关注)。

我写了很多,我觉得我可以写更多。 无论如何,我希望我不会因为这是不受欢迎的意见而被低估。 这个问题显然是一个很有价值的问题,我希望我能提供一个有价值的答案,即使这不是一般意见。

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

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

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

在这里输入图像描述

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

在这里输入图像描述

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

在我们的应用程序中,我们有一个主窗口,用户可以将各种“程序”作为单独的标签运行。 尽可能多的我们试图保持我们的应用程序到这个单一的窗口。

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

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

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

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

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

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

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

一些注意事项:

  • 在这些无模式的窗口中使用JDialog似乎是最好的做法
  • 使用使用新的ModalityType而不是布尔modal参数的构造函数。 这是什么给这些对话框的任务栏图标。
  • 对于非modal dialog,将一个空的父对象传递给构造函数,但是find它们相对于它们的“父”窗口。
  • 在Windows上的Java版本6有一个错误 ,这意味着你的主窗口可以成为'永远在最上面',而你没有告诉它。 升级到版本7来解决这个问题

将jInternalFrame放入主框架并使其不可见。 那么你可以用它来进一步的事件。

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

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

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

  • 不友好的用户界面:导入一堆粘在一起的JFrame并不容易,它看起来就像你的应用程序是一组不一致的,devise不佳的应用程序。

  • 使用JInternalFrame很容易这是一种反复的方式,现在比其他人更加聪明(或者有更多的空闲时间),我们已经想到了Desktop和JInternalFrame模式,所以我build议使用它。

不好的做法肯定。 其中一个原因是,对于每个JFrame都显示一个新的任务栏图标的事实,这不是非常“用户友好”的。 控制多个JFrames将让你抓紧你的头发。

就个人而言,我会使用一个JFrame你的types的应用程序。 显示多种东西的方法取决于你,有很多。 Canvas,JInternalFrame,CardLayout,甚至JPanels可能。

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

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

相反,我们可以在同一个jframe中使用多个jpanel的jpanel。

我们也可以在这个jpanels之间切换,所以它给了我们在jframe中显示更多的东西的自由。

对于每个jpanel我们可以devise不同的东西,所有这个jpanel可以一次显示在单个jframe上。

要切换这个jpanels,为每个jpanel使用菜单栏和每个jpanel或jbutton的菜单项。

一个以上的jframe不是一个好的做法,但是如果我们需要多个jframe,没有什么不对的。 但是为了满足我们的不同需求而改变一个jframe,而不是使用多个jframe。

如果帧的大小相同,为什么不创build帧并传递帧作为参考。

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

这不是一个好的做法,但即使你想使用它,你可以使用单身模式作为它的好处。 我在我的大部分项目中都使用了单例模式。