5.2.4 组件混合

前面提到过,每个AWT组件都存在一个与之对应的底层操作系统上的原生控件,一般称之为重量级组件;而Swing是自己绘制用户界面的内容,一般称之为轻量级组件。在Java 6 Update 12之前,在同一个用户界面中同时混用重量级和轻量级组件,会产生显示上的问题。这主要是由组件在Z轴上的覆盖顺序造成的,所产生的结果是AWT组件始终出现在Swing组件的前面。这个问题在Java 6 Update 12中得到了修正。从而使混用AWT和Swing组件不再存在显示上的问题。

从实现的角度上来说,Swing组件也不能完全脱离AWT而存在。在Swing中,所有组件的父类javax.swing.JComponent继承自AWT中的Container类。虽然Swing组件的界面是自行绘制的,但是也需要一个包围它的AWT组件,因为Swing组件依赖AWT与底层的操作系统进行交互。Swing的做法相当于:AWT提供一个完全空白的窗口,Swing的组件直接在这个窗口上进行绘制。用户界面要与底层操作系统进行交互时,通过这个AWT窗口来完成即可。所以对一个完全使用Swing组件来创建的用户界面来说,它的顶层窗口一定会通过AWT与一个原生控件相对应。

虽然混用AWT和Swing组件不再存在显示上的问题,但仍然推荐应用程序只选用Swing或AWT中的一种来作为图形界面组件库,尤其推荐使用Swing。新开发的桌面程序应该考虑使用JavaFX。