[转载]驯服 Tiger: 利用 Tiger 为窗格减压

驯服 Tiger: 利用 Tiger 为窗格减压
有多少次您是使用 frame.getContentPane().add() 编写代码,或者说有多少次在调用 add() 之前忘记获得内容窗格,并最终以在运行时抛出 Error 结束?作为顾问,John Zukowski 将在这一篇 驯服 Tiger 技巧中向您展示:这些问题都已成为过去。请在附属的 讨论论坛 中与作者和其他读者分享您对本文的看法。(也可以单击本文顶部或底部的 讨论 来访问该论坛。)

欢迎来到没有内容窗格的世界。在研究如何可以 使用内容窗格之前,让我们先看一下内容窗格是什么,以及它为什么存在。在 Swing 中,所有顶级容器,比如 JFrameJAppletJDialog,都是由 JRootPane 来内部管理的。但是,为什么这些帧不自己管理自己呢?根窗格使顶级对象能够拥有菜单栏、将对象拖到其他组件之上的 glass 窗格,以及一个用于包含所有容器组件的内容窗格。而您要用这个内容窗格来设置布局管理器和添加组件,如图 1 所示。因为所有的顶级容器都需要相同的对象集合,所以其管理被委派给 JRootPane


图 1. JRootPane 容器
JRootPane 容器

老方法

在了解使用内容窗格(或者“令人痛苦的东西”,视情况而定)的新方法之前,让我们回过头来看一下在引入 Swing 之前是如何使用内容窗格的。在 5.0 版本之前,无法设置帧的布局管理器或者直接将组件添加到帧中。您必须获得该帧的内容窗格,用它作为替代。清单 1 中显示了一般的内容窗格使用流程:


清单 1. 5.0 之前的内容窗格使用情况
				
  JFrame frame = new JFrame("Title");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JLabel label = ...;
  JButton button = ...;
  Container contentPane = frame.getContentPane();
  LayoutManager layout = new GridLayout(1,2);
  contentPane.setLayout(layout);
  contentPane.add(label);
  contentPane.add(button);

内容窗格本身并不难使用,但是编程人员未必总是记得直接处理内容窗格。如果您偶尔想试着更改帧的布局管理器或者在运行期间直接将组件添加到帧中,那么您将看到以下错误:

  java.lang.Error: Do not use javax.swing.JFrame.setLayout() use
    javax.swing.JFrame.getContentPane().setLayout() instead

这就是所有人都在猜测的,为什么 Java 平台不够智能,无法知道您试图更改帧的布局管理器时实际上是想为内容窗格更改布局管理器。在 5.0 版本之前,您必须记得在做其他任何事之前,要先获得内容窗格。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


使用 Tiger 的方法

通过使用 5.0 版本,Swing 开发人员的生活变得更加轻松。虽然内容窗格仍然存在,但您几乎不必直接使用它。调用 setLayout()add()remove() 现在被转到内容窗格上进行。换句话说,现在不用获得诸如包含 getContentPane()JFrame 之类的高级容器的内容窗格,然后对其进行操作,而是直接在帧对象上调用 setLayout()add()remove() 即可。清单 2 显示了处理帧的新方法:


清单 2. Tiger 技术
				
  JFrame frame = new JFrame("Title");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JLabel label = ...;
  JButton button = ...;
  LayoutManager layout = new GridLayout(1,2);
  frame.setLayout(layout);
  frame.add(label);
  frame.add(button);


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


结束语

指出这样一点很重要,即内容窗格并没有从框架中删除掉,只是您通常不必直接处理它了。为什么只是说通常,而不是说总是呢?实际上,有时您确实 必须直接处理内容窗格。在帧上调用 setBackground() 无法将该调用传递给内容窗格,它只会改变帧的背景。setComponentZOrder() 方法是另一种类似的处理方法。在帧上调用 setComponentZOrder() 将改变帧中的布局。实际上,您真正需要的方法是在内容窗格上调用 setComponentZOrder(),因为它随后将处理内容窗格中组件的叠置顺序(z-order)。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130190/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-130190/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值