使用多个JFrame:好还是坏的做法?[已关闭]

2022-08-31 04:18:38

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

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


答案 1

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

糟糕(糟糕,糟糕)的做法。

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

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

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

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

许多图像

在这种情况下,如果多个元素是图像,则最好改用以下任一元素:

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


答案 2

自从我开始编写 Swing 应用程序以来,我一直在实施这种多重方法。在大多数情况下,我一开始就这样做了,因为我不知道更好。然而,随着我作为开发人员的经验和知识的成熟,并开始在线阅读和吸收许多更有经验的Java开发人员的意见,我试图从多种方法(在当前项目和未来项目中)转向,但遇到了......得到这个...来自我的客户的阻力!当我开始实现模式对话框来控制单独组件的“子”窗口时,我的客户开始抱怨!我很惊讶,因为我正在做我认为是最佳实践的事情!但是,正如他们所说,“幸福的妻子是幸福的生活。您的客户也是如此。当然,我是承包商,所以我的最终用户可以直接访问我,开发人员,这显然不是一个常见的情况。JFrameJFrameJInternalFrame

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

  1. 布局的极致灵活性 - 通过允许单独的布局,您可以让最终用户能够分散并控制他/她的屏幕上的内容。这个概念感觉是“开放”的,不受限制的。当你走向一个大和一堆s时,你失去了这个。JFrameJFrameJInternalFrame
  2. 适用于非常模块化的应用程序 - 在我的情况下,我的大多数应用程序都有3 - 5个大的“模块”,它们实际上彼此之间没有任何关系。例如,一个模块可能是销售仪表板,另一个模块可能是会计仪表板。他们不互相交谈或任何东西。但是,执行官可能希望打开两者,并且它们是任务栏上的单独框架,这使他的生活更轻松。
  3. 使最终用户可以轻松引用外部材料 - 有一次,我遇到过这种情况:我的应用程序有一个“数据查看器”,您可以从中单击“添加新”,它将打开一个数据输入屏幕。最初,两者都是s。但是,我希望数据输入屏幕的父级是数据查看器。我做了更改,并立即接到一个最终用户的电话,他严重依赖这样一个事实,即他可以最小化或关闭查看器,并在他引用程序的另一部分(或网站,我不记得了)时保持编辑器打开。他不在多显示器上,所以他需要将输入对话框放在第一位,将其他东西放在第二位,数据查看器完全隐藏。这在 a 中是不可能的,对于 a 来说肯定也是不可能的。我不情愿地把它改回了分开,因为他的理智,但它教会了我一个重要的教训。JFrameJDialogJDialogJInternalFrameJFrames
  4. 误区:难以编码 - 根据我的经验,这不是真的。我不明白为什么创建一个比创建一个更容易。事实上,根据我的经验,提供的灵活性要小得多。我已经开发了一种系统化的方式来处理应用程序中的打开和关闭,这种方法确实运行良好。我几乎完全从框架的代码本身控制框架;创建新帧,控制后台线程上数据的检索和EDT上的GUI代码,如果用户尝试打开框架两次,则恢复/将框架放在前面,等等。打开我的s所需要的只是调用一个公共静态方法,而open方法,结合一个事件来处理其余的(框架已经打开了吗?它不是打开的,而是加载的?等等)。我使此方法成为模板,因此为每个帧实现并不困难。JInternalFrameJFrameJInternalFramesJFrameSwingWorkerJFrameopen()windowClosing()
  5. 神话/未证实:资源繁重 - 我想看到这个推测性陈述背后的一些事实。虽然,也许,你可以说一个需要比一个更多的空间,即使你打开100秒,你真正会消耗多少资源?如果您担心的是由于资源而导致的内存泄漏:调用会释放框架用于垃圾回收的所有资源(我再次说,a 应该调用完全相同的关注点)。JFrameJInternalFrameJFramedispose()JInternalFrame

我写了很多,我觉得我可以写更多。无论如何,我希望我不会仅仅因为这是一个不受欢迎的观点而被否决。这个问题显然是一个有价值的问题,我希望我提供了一个有价值的答案,即使它不是普遍的看法。

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

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

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

enter image description here

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

enter image description here


推荐