在Swing中创建TreeTable

TreeTableTreeTable的一个结合 就是一个即能够展开和收起行,同时也能够显示多个列的组件。在Swing的标准包里没有一个叫做JtreeTable的组件,但是我们很容易通过把Jtree做成Jtable的渲染器来创建一个这样的组件。

这篇文章就是关于如何使用该技术来创建一个TreeTable。最后实现一个名为TreeTableExample0的例子程序,该例子实现了一个TreeTable的浏览器,可以用来浏览本机的文件系统(如下图所示)

 

在Swing中创建TreeTable_第1张图片

Swing中,JtreeJtableJlist JcomboBox组件都是使用一个叫做单元格渲染器(Cell Render)的指定对象来画内容。单元格渲染器的paint()方法来画list中的每一项,tree中的每个节点,table中的每个单元格。单元格渲染器就象一个“印章(rubber stamp)”,它会移动到setBounds()方法指定的位置,然后用paint()方法来画。

 

通过使用组件来渲染单元格,你可以仅创建一个组件来高效地显示大量的相同组件。缺省的,Swing组件使用支持简单的文本和图标组合(Text Icon)的Jlabel来做单元格的渲染器。要使用任何的Swing组件做单元格渲染器,只需创建一个实现了相应的单元格渲染器接口的子类。如:JtableTableCellRenderer接口,JlistListCellRenderer接口,等等。

 

Swing中的渲染

下面是一个如何在JTable中使用JcheckBox作为渲染器的例子

 

public class CheckBoxRenderer extends JCheckBox 
implements TableCellRenderer { 
public Component getTableCellRendererComponent(JTable table, 
Object value, boolean isSelected, 
boolean hasFocus, int row, int column) { 
setSelected(((Boolean)value).booleanValue())); 
return this; 
} 
}


来看看下面例子是如何工作的
下面的代码段是本文后面介绍的例子中的一个片断 ,演示了如何用JTree来渲染JTable的内部。这个例子稍微有点儿不寻常,是因为它把JTree的每单个节点画到JTable的每单个单元格,而不是把整个树画到每个JTable的单元格
我们使用通常的方法开始:通过扩展Jtree类和实现TableCellRenderer接口把Jtree展开到单元格渲染器。为了实现一个单元格渲染器所需的行为,我们必须让我们的渲染器仅把树的节点画在一个特定的表单元格中。 实现这些的一个简单方法就是重写setBounds()方法和paint()方法,如下:

public class TreeTableCellRenderer extends JTree 
implements TableCellRenderer { 
protected int visibleRow; 
public void setBounds(int x, int y, int w, int h) { 
super.setBounds(x, 0, w, table.getHeight()); 
} 
public void paint(Graphics g) { 
g.translate(0, -visibleRow * getRowHeight()); 
super.paint(g); 
} 
public Component getTableCellRendererComponent(JTable table, 
object value, 
boolean isSelected, 
boolean hasFocus, 
int row, int column) { 
visibleRow = row; 
return this; 
} 
} 


 

当每个单元格绘制好以后,JTable进行正常的渲染过程,设置其边界,请求绘制。然而在本例中,我们使用一个实例变量visibleRow来记录当前绘制的单元格的行号。同时我们重写了setBounds(),因此即使当JTable根据当前绘制的单元格的尺寸来设定自己的边界的时候,Jtree也能和JTable保持同意的高度。
为了完成该功能,我们还要重写paint(), 使用已经存储的变量visibleRow,把剪辑矩形区域移动到tree的相应部分的上方。结果是当table要求绘制的时候,Jtree 仅绘制它的其中一个节点。
除了把Jtree做成单元格第一列的渲染器,我们还把Jtree作为这些单元个的编辑器。这种作法的效果是JTable传递所有的鼠标和键盘事件给这个“编辑器” - 也就允许tree接受用户输入来展开和收缩它的节点。

例子:一个文件系统浏览器
文中的例子创建了一个文件系统浏览器,每个目录可以展开和收起,表中的其它列显示文件和目录的重要属性,如文件大小和日期等
下面是例子中的类文件列表,及其用途描述:
 TreeTableModel.java: 新接口,扩展了TreeModel接口,描述TreeTable中要显示那些数据
 AbstractTreeTableModel.java: TreeTableModel的基类,该类处理一些监听器。
 TreeTableModelAdapter.java:  实现了TreeModel接口的包装类,输入参数为TreeTableModel和Jtree
 AbstractCellEditor.java:  CellEditors的基类,该类处理一些监听器。
 JTreeTable.java: JTable的子类,该类可以从TreeTableModel中渲染数据
 MergeSort.java:  一个合并排序的实现
 FileSystemModel.java: 本机文件系统的模型,AbstractTreeTableModel的实子类,实现了TreeTableModel接口
 TreeTableExample0.java:
 显示TreeTable的示例程序。
 sources.zip:
包含上述文件的压缩文件,当你运行程序TreeTableExample0, 显示一个本地文件系统中文件和目录的TreeTable。就像文章开始部分显示的图片。 点击表的第一列中的支元素,项目就会象其它树一样的展开和收缩。

 

你可能感兴趣的:(浏览器,swing,object,tree,table,Class)