Swing的API具有很强的灵活性和可扩展性,比如标准复合数据型组件一般不需要进行渲染器扩展,就可以实现许多应用,但是当遇到需要自定义扩展的需求时,Swing的高度抽象灵活的MVC框架也可以优雅从容的完成。Swing的这一特色典型的体现在其渲染器扩展思想上。那么如何使用渲染器呢?如何自定义渲染器来扩展组件呢?如何将渲染器思想应用到自定义组件上呢?
复合数据类型的组件如JTable、JTree、JList以及JComboBox都定义适合自己类型的渲染器接口,它们与渲染器接口之间的映射关系如下表所示:
组件 渲染器
JTable TableCellRenderer
JTree TreeCellRenderer
JList ListCellRenderer
JComboBox ListCellRenderer
TableCellRenderer接口定义了JTable渲染器接口:
- public interface TableCellRenderer {
- Component getTableCellRendererComponent(JTable table, Object value,
- boolean isSelected, boolean hasFocus,
- int row, int column);
- }
TreeCellRenderer定义了JTree的渲染器接口。
- public interface TreeCellRenderer {
- Component getTreeCellRendererComponent(JTree tree, Object value,
- boolean selected, boolean expanded,
- boolean leaf, int row, boolean hasFocus);
- }
ListCellRenderer是JList、JComboBox的渲染器接口。
- public interface ListCellRenderer
- {
- Component getListCellRendererComponent(
- JList list,
- Object value,
- int index,
- boolean isSelected,
- boolean cellHasFocus);
- }
其实,渲染器不仅仅可以用在标准组件JTable、JList、JTree和JComboBox,也可以在自己定制的组件中使用渲染器的思想实现复杂的界面,比如UML图、工作流图、电路图,模拟JTable实现类似于MS Excel的电子表格控件,甚至可以实现自己的用户界面设计工具。前面文章中曾经提到过的数据库设计插件和报表设计插件就是根据渲染器原理自定义出的组件。
因此,熟悉了Swing的结构尤其是渲染器的思想,加上一些额外的知识,比如double buffering、glass pane、robot、swing threading、color model、java2d等等,可以做出许多事情来。人有多大胆,地有多大产。但深入学习和了解Swing的基本结构,这是前提。今天的文章主要是以实例演示了这些渲染器的应用,文中的例子只是演示作用,加深你对渲染器的印象。但是真正吃透渲染器的各种技术,还需要自己深入的学习和实践。
【编辑推荐】