2012-04-10 68 views
1

我见过两种做有神论的方式,他们都似乎工作,但我只是想知道,如果一个更好的做法比另一个更好。Java - 向JFrame添加组件

例如,一个名为JFramemyFrame你可以这样做:

myFrame.add(new JButton("OK")); 

而且你还可以这样做:

Container c = myFrame.getContentPane(); 
c.add(new JButton("OK")); 

是这些 '正确' 呢?

回答

5

JFrame

JFrame类类Javadoc逐字复制与框架稍微不兼容。像所有其他JFC/Swing顶级容器一样,JFrame包含一个JRootPane作为其唯一的孩子。通常,根窗格提供的内容窗格应包含JFrame显示的所有非菜单组件。这与AWT框架案例不同。作为方便添加及其变体,必要时,remove和setLayout已被覆盖以转发到contentPane。这意味着你可以这样写:

frame.add(child); 

那孩子将被添加到contentPane。内容窗格将始终为非空值。尝试将其设置为null将导致JFrame抛出异常。默认的内容窗格将设置一个BorderLayout管理器。有关添加,删除和设置JFrame的LayoutManager的详细信息,请参阅RootPaneContainer。

所以两者是等价的,都是正确的

2

从Java5中不需要

  • 添加JComponentsContentPane,只是JFrame.add(JComponent)

  • JFrame已经实施BorderLayout ,那么myFrame.add(new JButton("OK"));被放置到CENTER区域

1

我会确定地说,

Container c = myFrame.getContentPane(); 
c.add(new JButton("OK")); 

是最实用的一个。由于您很可能稍后需要使用容器,因此您不需要稍后再次写入容器。例如,如果您需要为框架设置另一个布局,则会使用它。但如前所述,两者都可以使用。

+1

每一个不必要的字母都是噪音和噪音导致不可维护的代码:-)虽然contentPane的属性只能直接访问(如fi背景,不透明..),但布局不是其中的一个,因此您的参数咳嗽...... – kleopatra 2012-04-10 12:11:13