添加组件没有JPanel是正确的事情

时间:2014-01-17 03:48:27

标签: java swing jpanel

你好我有一个关于JPanel组件的问题这是一个非常简单的问题没有编码问题为什么我必须将gui组件添加到JPanel如果我可以简单地将它们直接添加到JFrame中我总是要添加所有组件对于JPanel,如果我不这样做,那就是在任何一个术语中影响产区

4 个答案:

答案 0 :(得分:4)

您不必向“JPanel”添加内容,但可以将它们直接添加到JFrame中,但了解一些事项:

  • 使用add(...)方法向典型的JFrame添加组件时,实际上是将其添加到JFrame的contentPane ...
  • ...这是 JPanel
  • 如果这样做,您将需要了解Java布局管理器,以及将组件添加到使用BorderLayout的容器的含义,例如JFrame contentPanes。
  • 但话说回来,如果需要,可以更改contentPane的布局管理器。

答案 1 :(得分:3)

我会给已经提供的答案略有不同(或者可能有不同的重点)。

复杂布局

让我们假设你开发了一个扩展框架的GUI。然后用户决定他们想要applet。您是否重新制作或重构框架,以便所有内容都在JPanel中,然后可以添加到框架,小程序,...或一张卡片{ {1}}或CardLayoutJTabbedPaneJDialog的一个标签,或较大版面的一部分或..

最后一个方便客户可能会说。 “好的很好,但现在在顶部添加一个工具栏,重复”编辑“菜单的操作。”如果您已经使用了内容窗格的JWindow一个BorderLayout.PAGE_START,它会强制重构。另一方面,如果GUI是在JFrame中设计的,那么只需将GUI添加到JPanel的另一个面板的CENTER,并将工具栏添加到另一个小组的BorderLayout。将其他面板添加到(框架,小程序,窗口,选项卡式窗格选项卡..)并完成作业。

最重要的是,绝大多数现实世界的GUI使用布局组合(即使PAGE_START在我们添加任何内容之前都有许多布局)。这些布局通常在JFrame中完成,为了保持所有一致,我们也可以将该层次结构中的“顶级”组件另外JPanel。< / p>

白色空间

考虑以下GUI。它使用布局填充&am​​p; white space的边框。

没有空白区域的GUI看起来非常“拥挤”,所以添加一些通常会更好。

但您可能会注意到getContentPane()会返回JPanel,但没有Container方法!这是由于AWT导致的历史原因,Swing很大程度上依赖于此。

为Swing组件返回的内容窗格通常是基于Swing的setBorder()我们可以设置边框,但是没有合同保证,所以我们需要检查JPanel,然后将其转换为一个。对于那些有“坏代码味道”的我 - 对于边框,我会直接创建一个instanceof并从那里开始。

自定义绘画

如果我们需要进行自定义绘制,最好再使用JPanel(或子类),因为默认情况下它们是双缓冲的。再次出于基于AWT的历史原因,JComponent 不是双重缓冲。

此外,虽然JFrame(或@Override等)中的paintComponent(Graphics)方法总是JComponent,但JPanel 却没有这样的方法。框架中的自定义绘画需要我们覆盖JFrame方法并自己处理双缓冲。

摘要

因此,当可能将组件直接添加到框架时:

  • 它限制了GUI的重用,并使添加更加复杂。
  • 限制在GUI周围放置空白区域。
  • 通过引入关于覆盖哪种方法的混淆,使得自定义绘画变得更加复杂,并且需要更多代码来启用双缓冲。

最好在paint(Graphics)中开发GUI。

答案 2 :(得分:1)

从技术上讲,是的,您可以直接向框架添加控件而无需先添加某种容器(当我这样说时,您实际上是在框架的内容窗格中添加内容,而不是框架本身。)

这一点往往不鼓励的主要原因是让您使用JFrame,并且难以在其他地方重新使用您的UI。\

您可能考虑首先向容器添加组件的另一个原因是它可以更容易地开发复杂的接口。这允许您将UI分成几个部分,并专注于这些部分的布局要求,其中可能包括向其添加其他子容器。

这通常称为复合布局管理

答案 3 :(得分:0)

直接在JFrame中无法添加许多gui组件。例如,您无法在JFrame中直接添加图像作为背景。还有许多其他控件,你不能只使用JFrame。