Swing控件是改善为了AWT控件而发展出来的轻量级GUI控件采用的是Composite设计模式然而由于没有清楚的分隔组件(Component)和容器(Container)的边界就造成了Swing的几乎每个单独的组件都是一个容器能够添加其他容器或者组件看似强大的功能实际上造成了大量的问题 和人的直觉非常不一致Swing的GUI上的各种组件如果添加的面板过多的话就造成各个组件的层次很深处理类似focus管理这样的问题就很麻烦坐标的转换也很复杂由于父子关系过多您不看代码只看GUI凭直觉难以区分组件的父子关系 使用上的困扰Swing组件本身由于不能分清是组件还是容器很多容器方法比如setEnabled就没有效果需要写代码遍历所有子组件调用所有的子组件相同的方法而类似设置透明的方法也有这个问题如果设置某个容器透明也需要设置所有的子组件的透明属性组件和容器的很多方法没有很好的定义这对了解Swing结构的人不是问题但是对于熟悉别的GUI类库的人就产生了很大的困惑因为不少容器上的方法调用后是没有效果的 布局上的困难使用Swing开发界面的程序员会发现即使Swing提供了这么多布局管理器然而您想通过这些布局管理器做出很专业的界面却非常难因为布局管理器非常依赖父容器和子组件的各种状态尽管Swing最新的版本提供了类似组件和容器间隔的方法然而还没有被大部分布局管理器采用其实并不是布局管理器不够强大的问题事实上很多专业的界面需要从组件级别做出良好的定义例如getPreferredSizegetMinimumSizegetMaximumSize方法这些方法的不确定性很强布局管理器不能过度依赖这些方法另外不少Swing组件会根据容器的大小进行绘制这也造成了很多不确定性很多人喜欢使用NullLayout可能就是这个原因客户需要的是一个稳定的可预知的界面如果使用了布局管理器会发现界面在不同的系统下展示的不同 而对比不少GUI类库您会发现他们的定义更为严格比方JavaME LCDUI类库组件和容器是严格分开的组件的添加是严格限制的布局也是定义的非常严格的没有布局管理器类似滚动条这些支持都在底层进行了隐藏真正减少了GUI开发者的负担 总得来说对Composite设计模式应该慎用如果一定要用一定要良好的定义组件(Component)和容器(Container)的边界不然很多功能会陷入没有意义的父子遍历例程增加了复杂性却没有带来很多好处 |