我正在开发一个应用程序,可以显示图像,播放数据库中的声音。我试图决定是否使用单独的JFrame从GUI向数据库添加图像。我只是想知道使用多个JFrame窗口是否是一个好的实践?
dojqjjoe1#
我只是想知道使用多个JFrame是否是一种好做法?糟糕的做法。
在一个GUI中显示多个元素的方式有很多种,例如:1.CardLayout(短demo.)。有益于:1.显示类似向导的对话框。1.显示具有关联组件的项目的列表、树等选项。1.在无组件和可见组件之间翻转。1.JInternalFrame/JDesktopPane通常用于MDI。1.JTabbedPane表示组件组。1.JSplitPane一种显示两个组件的方法,其中一个组件或另一个组件的重要性(大小)根据用户的操作而变化。1.JLayeredPane许多井…分层组件。1.JToolBar通常包含一组动作或控件。可以在GUI中拖动,也可以完全根据用户需要将其移出。如上所述,将根据父进程最小化/恢复。1.作为JList中的项目(下面的简单示例)。1.作为JTree中的节点。1.Nested layouts。
CardLayout
JInternalFrame
JDesktopPane
JTabbedPane
JSplitPane
JLayeredPane
JToolBar
JList
JTree
但是,如果这些策略不适用于特定用例,请尝试以下方法。建立一个主JFrame,然后为其余的自由浮动元素显示JDialog或JOptionPane示例,将框架用作对话框的父对象。
JFrame
JDialog
JOptionPane
在这种情况下,如果多个元素是图像,则最好使用以下任一元素:1.单个JLabel(居中于滚动窗格中)可显示用户当时感兴趣的任何图像。如ImageViewer所示。
JLabel
ImageViewer
1.单行JList。如this answer所示。只有在所有维度都相同的情况下,“单行”部分才有效。或者,如果您准备动态缩放图像,并且它们的纵横比都相同(例如4:3或16:9)。
wh6knrhe2#
自从我开始编写Swing应用程序以来,多重JFrame方法一直是我实施的。在大多数情况下,我一开始这么做是因为我不知道什么更好然而随着我作为开发人员的经验和知识的成熟,以及开始阅读和吸收更多经验丰富的Java开发人员的在线意见,我试图从多重JFrame方法(在当前项目和未来项目中)中转移,但却遇到了……我的客户的抵制!当我开始实现模态对话框来控制单独组件的“子”窗口和E1D2D1E时,我的客户开始抱怨!我很惊讶,因为我正在做我认为是最佳实践的事情!但是,正如他们所说,“幸福的妻子就是幸福的生活。”你的客户也是如此。当然,我是一个承包商,所以我的最终用户可以直接访问我,开发人员,这显然不是一个常见的场景。因此,我将解释多重JFrame方法的好处,以及其他人提出的一些缺点。1.布局的最大灵活性-通过允许单独的E1D4D1E,您可以让终端用户分散和控制屏幕上的内容。这一概念感觉“开放”且不受限制。当你走向一个大的JFrame和一堆E1D6D1E时,你会失去这个。1.适用于非常模块化的应用程序-在我的例子中,我的大多数应用程序都有3-5个大的“模块”,它们之间实际上没有任何关系。例如,一个模块可能是销售 Jmeter 板,一个可能是会计 Jmeter 板。他们不互相交谈或任何事情。然而,执行官可能想同时打开这两个框架,而任务栏上的独立框架使他的生活更轻松。1.使最终用户很容易参考外部材料-有一次,我遇到了这样的情况:我的应用程序有一个“数据查看器”,您可以从中单击“添加新”,它将打开一个数据输入屏幕。最初,它们都是JFrames。然而,我希望数据输入屏幕是一个JDialog,其父级是data viewer。我做了更改,立即接到了一个终端用户的电话,他非常依赖这样一个事实,即当他引用程序的另一部分(或我不记得的网站)时,他可以最小化或关闭查看器,并保持编辑器打开。他不是在多监视器上,所以他需要输入对话框放在第一位,其他东西放在第二位,数据查看器完全隐藏。对于JDialog来说,这是不可能的,当然对于JInternalFrame来说也是不可能的。为了他的理智,我勉强把它改回单独的JFrames,但这给了我一个重要的教训。1.神话:难以编码-根据我的经验,这不是真的。我不明白为什么创建JInternalFrame比创建JFrame更容易。事实上,根据我的经验,JInternalFrames提供的灵活性要小得多。我开发了一种系统化的方法来处理我的应用程序中E1D15D1E的打开和关闭,这种方法非常有效。我几乎完全从帧的代码本身控制帧;创建新的框架SwingWorkers,用于控制后台线程和EDT上GUI代码的数据检索,如果用户尝试打开框架两次,则恢复/将其带到前面,等等。打开我的JFrames所需的全部是调用公共静态方法open()和打开方法,结合windowClosing()事件处理其余部分(帧是否已打开?是否未打开,但正在加载?等),我将此方法作为模板,因此不难为每个帧实现。1.神话/未经证实:资源密集-我想看看这一推测性陈述背后的一些事实。尽管您可能会说JFrame比JInternalFrame需要更多的空间,但即使您打开了100个E1D22D1E,您真正需要消耗多少资源?如果您关心的是由于资源导致的内存泄漏:调用dispose()将释放框架用于垃圾收集的所有资源(我再说一遍,JInternalFrame应该调用完全相同的问题)。我写了很多,我觉得我可以写更多。无论如何,我希望我不会因为这是一个不受欢迎的观点而被投票。这个问题显然是一个很有价值的问题,我希望我已经提供了一个有价值的答案,即使这不是普遍的观点。多帧/每帧单文档(SDI)与单帧/每框架多文档(MDI)的一个很好的例子是Microsoft Excel。计量吸入器的一些好处:
JFrames
JInternalFrames
SwingWorker
open()
windowClosing()
dispose()
SDI(单文档界面,即每个窗口只能有一个文档):
MDI(多文档接口,即每个窗口可以有多个文档):
7kjnsjlb3#
我想用一个我刚刚参与的例子来反驳“用户不友好”的论点。在我们的应用程序中,我们有一个主窗口,用户在其中以单独的选项卡运行各种“程序”。我们尽可能地将应用程序保持在这个单一窗口中。它们运行的其中一个“程序”显示系统生成的报告列表,用户可以单击每行上的图标,弹出一个报告查看器对话框。此查看器显示的是报告的纵向/横向A4页面,因此用户希望此窗口相当大,几乎填满了他们的屏幕。几个月前,我们开始收到客户的请求,要求将这些报表查看器窗口设置为非模态,以便他们可以同时打开多个报表。有一段时间,我拒绝了这个请求,因为我认为这不是一个好的解决方案。然而,当我发现用户如何绕过我们系统的“缺陷”时,我的想法改变了。他们打开一个查看器,使用“另存为”功能将报告以PDF格式保存到特定目录,使用Acrobat Reader打开PDF文件,然后对下一份报告执行相同操作。他们将有多个Acrobat阅读器,运行他们想要查看的各种报告输出。所以我让步了,让观众无模式。这意味着每个查看器都有一个任务栏图标。当最新版本上周发布给他们时,他们的强烈React是他们喜欢它。这是我们最近最流行的系统增强功能之一。所以你继续告诉你的用户,他们想要的是坏的,但最终不会对你有任何帮助。一些说明:
ModalityType
modal
mbyulnm04#
在主框架中制作一个jInternalFrame,使其不可见。然后您可以将其用于其他事件。
jInternalFrame.setSize(300,150); jInternalFrame.setVisible(true);
1tu0hz3e5#
我上次接触秋千已经有一段时间了,但一般来说,这样做是不好的。想到的一些主要缺点:
***更昂贵:*您将不得不分配更多的资源来绘制其他类型的窗口容器,如对话框或JInternalFrame。***不用户友好:*导航到一堆粘在一起的JFrame并不容易,看起来您的应用程序是一组不一致且设计糟糕的应用程序。*使用JInternalFrame很容易这是一种反驳,现在它更容易,而且其他人比我们更聪明(或有更多的空闲时间),我们已经考虑过桌面和JInternalFrame模式,所以我建议使用它。
2j4z5cfb6#
这绝对是个坏习惯。一个原因是,由于每个JFrame都显示了一个新的任务栏图标,因此它不是非常“用户友好”。控制多个E1D1D1E将使您的头发脱落。就个人而言,我会使用一个JFrame用于您的应用程序。显示多种内容的方法取决于您,有很多。Canvases、JInternalFrame、CardLayout,甚至可能是E1D6D1E。多个JFrame对象=痛苦、麻烦和问题。
Canvas
iq3niunx7#
我认为使用多个E1D0D1E不是一个好主意。相反,我们可以在同一JFrame中使用多于一个或多个JPanel的E1D1D1E。我们还可以在JPanels之间切换。因此,我们可以在JFrame中自由显示更多内容。对于每个JPanel,我们可以设计不同的东西,所有这些JPanel可以一次显示在单个JFrameone上。要在E1D9D1E之间切换,请为每个E1D12D1E或“按钮1D113D1EJ面板”使用JMenuBar和JMenuItems。多个JFrame不是一个好的做法,但如果我们想要多个E1E1D15D1E,也没有什么错。但最好根据我们的不同需求更改一个JFrame,而不是多个E1D17D1E。
JPanel
JMenuBar
JMenuItems
332nm8kg8#
如果帧的大小相同,为什么不创建帧并将帧作为参考传递给它呢。通过框架后,您可以决定如何填充它。这就像有一种计算一组数字平均值的方法。你会一遍又一遍地创建这个方法吗?
ekqde3dh9#
这不是一个好的实践,但即使您希望使用它,也可以使用单例模式。我在我的大多数项目中都使用了单例模式,这很好。
9条答案
按热度按时间dojqjjoe1#
我只是想知道使用多个JFrame是否是一种好做法?
糟糕的做法。
在一个GUI中显示多个元素的方式有很多种,例如:
1.
CardLayout
(短demo.)。有益于:1.显示类似向导的对话框。
1.显示具有关联组件的项目的列表、树等选项。
1.在无组件和可见组件之间翻转。
1.
JInternalFrame
/JDesktopPane
通常用于MDI。1.
JTabbedPane
表示组件组。1.
JSplitPane
一种显示两个组件的方法,其中一个组件或另一个组件的重要性(大小)根据用户的操作而变化。1.
JLayeredPane
许多井…分层组件。1.
JToolBar
通常包含一组动作或控件。可以在GUI中拖动,也可以完全根据用户需要将其移出。如上所述,将根据父进程最小化/恢复。1.作为
JList
中的项目(下面的简单示例)。1.作为
JTree
中的节点。1.Nested layouts。
但是,如果这些策略不适用于特定用例,请尝试以下方法。建立一个主
JFrame
,然后为其余的自由浮动元素显示JDialog
或JOptionPane
示例,将框架用作对话框的父对象。许多图像
在这种情况下,如果多个元素是图像,则最好使用以下任一元素:
1.单个
JLabel
(居中于滚动窗格中)可显示用户当时感兴趣的任何图像。如ImageViewer
所示。1.单行
JList
。如this answer所示。只有在所有维度都相同的情况下,“单行”部分才有效。或者,如果您准备动态缩放图像,并且它们的纵横比都相同(例如4:3或16:9)。wh6knrhe2#
自从我开始编写Swing应用程序以来,多重
JFrame
方法一直是我实施的。在大多数情况下,我一开始这么做是因为我不知道什么更好然而随着我作为开发人员的经验和知识的成熟,以及开始阅读和吸收更多经验丰富的Java开发人员的在线意见,我试图从多重JFrame
方法(在当前项目和未来项目中)中转移,但却遇到了……我的客户的抵制!当我开始实现模态对话框来控制单独组件的“子”窗口和E1D2D1E时,我的客户开始抱怨!我很惊讶,因为我正在做我认为是最佳实践的事情!但是,正如他们所说,“幸福的妻子就是幸福的生活。”你的客户也是如此。当然,我是一个承包商,所以我的最终用户可以直接访问我,开发人员,这显然不是一个常见的场景。因此,我将解释多重
JFrame
方法的好处,以及其他人提出的一些缺点。1.布局的最大灵活性-通过允许单独的E1D4D1E,您可以让终端用户分散和控制屏幕上的内容。这一概念感觉“开放”且不受限制。当你走向一个大的
JFrame
和一堆E1D6D1E时,你会失去这个。1.适用于非常模块化的应用程序-在我的例子中,我的大多数应用程序都有3-5个大的“模块”,它们之间实际上没有任何关系。例如,一个模块可能是销售 Jmeter 板,一个可能是会计 Jmeter 板。他们不互相交谈或任何事情。然而,执行官可能想同时打开这两个框架,而任务栏上的独立框架使他的生活更轻松。
1.使最终用户很容易参考外部材料-有一次,我遇到了这样的情况:我的应用程序有一个“数据查看器”,您可以从中单击“添加新”,它将打开一个数据输入屏幕。最初,它们都是
JFrame
s。然而,我希望数据输入屏幕是一个JDialog
,其父级是data viewer。我做了更改,立即接到了一个终端用户的电话,他非常依赖这样一个事实,即当他引用程序的另一部分(或我不记得的网站)时,他可以最小化或关闭查看器,并保持编辑器打开。他不是在多监视器上,所以他需要输入对话框放在第一位,其他东西放在第二位,数据查看器完全隐藏。对于JDialog
来说,这是不可能的,当然对于JInternalFrame
来说也是不可能的。为了他的理智,我勉强把它改回单独的JFrames
,但这给了我一个重要的教训。1.神话:难以编码-根据我的经验,这不是真的。我不明白为什么创建
JInternalFrame
比创建JFrame
更容易。事实上,根据我的经验,JInternalFrames
提供的灵活性要小得多。我开发了一种系统化的方法来处理我的应用程序中E1D15D1E的打开和关闭,这种方法非常有效。我几乎完全从帧的代码本身控制帧;创建新的框架SwingWorker
s,用于控制后台线程和EDT上GUI代码的数据检索,如果用户尝试打开框架两次,则恢复/将其带到前面,等等。打开我的JFrame
s所需的全部是调用公共静态方法open()
和打开方法,结合windowClosing()
事件处理其余部分(帧是否已打开?是否未打开,但正在加载?等),我将此方法作为模板,因此不难为每个帧实现。1.神话/未经证实:资源密集-我想看看这一推测性陈述背后的一些事实。尽管您可能会说
JFrame
比JInternalFrame
需要更多的空间,但即使您打开了100个E1D22D1E,您真正需要消耗多少资源?如果您关心的是由于资源导致的内存泄漏:调用dispose()
将释放框架用于垃圾收集的所有资源(我再说一遍,JInternalFrame
应该调用完全相同的问题)。我写了很多,我觉得我可以写更多。无论如何,我希望我不会因为这是一个不受欢迎的观点而被投票。这个问题显然是一个很有价值的问题,我希望我已经提供了一个有价值的答案,即使这不是普遍的观点。
多帧/每帧单文档(SDI)与单帧/每框架多文档(MDI)的一个很好的例子是Microsoft Excel。计量吸入器的一些好处:
SDI(单文档界面,即每个窗口只能有一个文档):
MDI(多文档接口,即每个窗口可以有多个文档):
7kjnsjlb3#
我想用一个我刚刚参与的例子来反驳“用户不友好”的论点。
在我们的应用程序中,我们有一个主窗口,用户在其中以单独的选项卡运行各种“程序”。我们尽可能地将应用程序保持在这个单一窗口中。
它们运行的其中一个“程序”显示系统生成的报告列表,用户可以单击每行上的图标,弹出一个报告查看器对话框。此查看器显示的是报告的纵向/横向A4页面,因此用户希望此窗口相当大,几乎填满了他们的屏幕。
几个月前,我们开始收到客户的请求,要求将这些报表查看器窗口设置为非模态,以便他们可以同时打开多个报表。
有一段时间,我拒绝了这个请求,因为我认为这不是一个好的解决方案。然而,当我发现用户如何绕过我们系统的“缺陷”时,我的想法改变了。
他们打开一个查看器,使用“另存为”功能将报告以PDF格式保存到特定目录,使用Acrobat Reader打开PDF文件,然后对下一份报告执行相同操作。他们将有多个Acrobat阅读器,运行他们想要查看的各种报告输出。
所以我让步了,让观众无模式。这意味着每个查看器都有一个任务栏图标。
当最新版本上周发布给他们时,他们的强烈React是他们喜欢它。这是我们最近最流行的系统增强功能之一。
所以你继续告诉你的用户,他们想要的是坏的,但最终不会对你有任何帮助。
一些说明:
ModalityType
而不是布尔modal
参数的构造函数。这就是这些对话框的任务栏图标。mbyulnm04#
在主框架中制作一个jInternalFrame,使其不可见。然后您可以将其用于其他事件。
1tu0hz3e5#
我上次接触秋千已经有一段时间了,但一般来说,这样做是不好的。想到的一些主要缺点:
***更昂贵:*您将不得不分配更多的资源来绘制其他类型的窗口容器,如对话框或JInternalFrame。
***不用户友好:*导航到一堆粘在一起的JFrame并不容易,看起来您的应用程序是一组不一致且设计糟糕的应用程序。
*使用JInternalFrame很容易这是一种反驳,现在它更容易,而且其他人比我们更聪明(或有更多的空闲时间),我们已经考虑过桌面和JInternalFrame模式,所以我建议使用它。
2j4z5cfb6#
这绝对是个坏习惯。一个原因是,由于每个
JFrame
都显示了一个新的任务栏图标,因此它不是非常“用户友好”。控制多个E1D1D1E将使您的头发脱落。就个人而言,我会使用一个
JFrame
用于您的应用程序。显示多种内容的方法取决于您,有很多。Canvas
es、JInternalFrame
、CardLayout
,甚至可能是E1D6D1E。多个JFrame对象=痛苦、麻烦和问题。
iq3niunx7#
我认为使用多个E1D0D1E不是一个好主意。
相反,我们可以在同一
JFrame
中使用多于一个或多个JPanel
的E1D1D1E。我们还可以在
JPanel
s之间切换。因此,我们可以在JFrame
中自由显示更多内容。对于每个
JPanel
,我们可以设计不同的东西,所有这些JPanel
可以一次显示在单个JFrame
one上。要在E1D9D1E之间切换,请为每个E1D12D1E或“按钮1D113D1EJ面板”使用
JMenuBar
和JMenuItems
。多个
JFrame
不是一个好的做法,但如果我们想要多个E1E1D15D1E,也没有什么错。但最好根据我们的不同需求更改一个
JFrame
,而不是多个E1D17D1E。332nm8kg8#
如果帧的大小相同,为什么不创建帧并将帧作为参考传递给它呢。
通过框架后,您可以决定如何填充它。这就像有一种计算一组数字平均值的方法。你会一遍又一遍地创建这个方法吗?
ekqde3dh9#
这不是一个好的实践,但即使您希望使用它,也可以使用单例模式。我在我的大多数项目中都使用了单例模式,这很好。