最近在给自己的一个搜索下载工具包做一个UI,弄成桌面应用。窗口顶部是标准的swing菜单,下面有几个AWT的label和button组件。当我加了几个菜单项然后运行之后,发现下拉菜单被label挡住了,无论如何设置都不行。后台查阅了相关资料,才知道这是AWT这个重量级组件和swing这个轻量级组件混用的不可调谐的矛盾。
AWT组件各自对应一个本地组件native peer,就是和操作系统相关,会因为操作系统不同而有不同。Swing中组件除顶级容器类组件如Window、Frame和Applet有自己的native peer外其他都没有对应的native peer,用来模拟这些Swing组件的图形对象资源都来自于它所在的顶层容器。由于二者的Z-order设计不同,所以它们混合使用来排版时会出现各种古怪的覆盖问题。而推荐的做法是尽量只使用其中一种组件,推荐Swing,理由如下:
1,高效的利用资源。AWT需要操作系统的额外开销。
2,维护平台一致性。重量级组件在不同平台具有不同的缺省外观、尺寸、布局、字体以及行为等。这需要编写额外代码维护各个平台程序的一致性。比如 Windows和Linux的缺省字体、大小和样式都不一样,需要显示的设置字体样式和大小等;在Windows很好看的布局有可能在Linux变得乱七八糟;组件间的间隔因为平台的不同而有很多变化。
3,良好的皮肤支持。AWT同SWT一样是不支持皮肤更换机制的。
参考文章:
[url]http://tech.e800.com.cn/articles/2009/83/1249251222247_1.html[/url]
SUN官方swing指南:
[url]http://java.sun.com/docs/books/tutorial/uiswing/[/url]
AWT组件各自对应一个本地组件native peer,就是和操作系统相关,会因为操作系统不同而有不同。Swing中组件除顶级容器类组件如Window、Frame和Applet有自己的native peer外其他都没有对应的native peer,用来模拟这些Swing组件的图形对象资源都来自于它所在的顶层容器。由于二者的Z-order设计不同,所以它们混合使用来排版时会出现各种古怪的覆盖问题。而推荐的做法是尽量只使用其中一种组件,推荐Swing,理由如下:
1,高效的利用资源。AWT需要操作系统的额外开销。
2,维护平台一致性。重量级组件在不同平台具有不同的缺省外观、尺寸、布局、字体以及行为等。这需要编写额外代码维护各个平台程序的一致性。比如 Windows和Linux的缺省字体、大小和样式都不一样,需要显示的设置字体样式和大小等;在Windows很好看的布局有可能在Linux变得乱七八糟;组件间的间隔因为平台的不同而有很多变化。
3,良好的皮肤支持。AWT同SWT一样是不支持皮肤更换机制的。
参考文章:
[url]http://tech.e800.com.cn/articles/2009/83/1249251222247_1.html[/url]
SUN官方swing指南:
[url]http://java.sun.com/docs/books/tutorial/uiswing/[/url]