回到顶部
您的当前位置: 编程语言> JAVA> JAVA基础> 系列教程
Java进阶(十一)JTable和JTree
2014-04-08 17:51:10
标签: 网络整理 Java 进阶 JTable和JTree

JTable显示表格,JTree显示树层次结构中的数据。

一:JTable

JTable是一个Swing组件,用于在二维网络的行和列中显示数据。

JTable不直接支持滚动。要创建一个可滚动的表格,需要创建滚动窗格JScrollPane,并把JTable的实例添加到该滚动窗格中。

JTable有三大支持模型:表格模型、列模型和列表选择模型。表格模型用来存储和处理数据;列模型用来表示表格中所有的列;列表选择模型与JList中使用的相同,用来在表格中选择行、列和单元格。JTable也有两个支持类:TableColumn和JTableHeader。TableColumn包含一个具体列的信息,JTableHeader可用于显示JTable表头的信息。每列都有一个默认的编辑器和绘制器。也可以通过实现TableCellEditor接口来创建一个自定义的编辑器,通过实现TableCellRenderer接口来创建一个自定义的绘制器。

JTable类包含7个用于创建表格的构造方法。

用行数据和列名创建一个表格,并将它放入一个滚动窗格中:

// Create a table
private JTable jTable1 = new JTable(data, columnNames);
 
public TestTable() {
  add(new JScrollPane(jTable1));
}

JTable是一个具有很多中属性、功能强大的控件,提供了多种自定义的方法。

二:表格模型和表格列模型

JTable将数据存储和处理的任务委托给它的表格数据模型。表格数据模型必须实现TableModel接口,该接口定义了注册表格模型监听器、管理单元格,以及获取行数、列数、列类和列名的方法。

要创建一个具体的TableModel,可以简单地扩展AbstractTableModel类并且至少实现下面三个方法:

① public int getRowCount()

② public int getColumnCount()

③ public Object getValueAt(int row, int column)

DefaultTableModel类扩展AbstractTableModel类并且实现了这三个方法。此外,DefaultTableModel提供数据的具体存储。数据存储在一个向量里。向量中的元素是对象数组,每个元素代表一个独立单元格的值。

自动排序和过滤:

自动排序和过滤是两个很有用的特性。为了使JTable能够按列进行自动排序,要用表格模型创建一个TableRowSorter实例,并按如下方式设置JTable的rowSorter:

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel);
jTable.setRowSorter(sorter);

当表格显示时,可以通过单击列首来对表格排序。

下面的语句创建了一个行过滤器,这些行的第一列和第二列的起始字母都是“U”。

RowFilter rowFilter = RowFilter.regexFilter("U.*", int[]{0, 1});
三:表格绘制器和编辑器

表单的单元格是通过单元格绘制器绘制的。在默认的情况下,单元格中显示的是单元格对象的字符串表示(toString()),该串可以像在文本域中的那样进行编辑。

在自己的表格模型类中,需要覆盖getColumnClass()方法,以返回列的类,如下所示:

public Class getColumnClass(int column) {
  return getValueAt(0, column).getClass();
}
在默认情况下,所有的单元格都是可编辑的。
JTable不会触发表格事件,但能够触发继承自父类JComponent的事件,例如,MouseEvent、KeyEvent和ComponentEvent等。当表格模型、表格列模型和表格选择模型发生变化时,这些模型就会触发表格事件。
四:JTree

JTree是一个Swing组件,它用树状层次结构显示数据。

树中的所有结点都是按层次索引表的形式显示的。树可以用来导航具有层次关系的结构化数据。树的结点可以有子结点。如果一个结点没有子结点,则称它为这棵树的叶结点;没有父结点的结点称为树的根结点。一棵树可以由许多子树组成,每个结点都是其子树的根结点。

双击结点或结点前面的叶柄,能够展开或折叠非叶子结点。

和JTable一样,JTree是一个非常复杂的组件,它具有许多支持接口和类。

JTree类包含7个用于创建树的构造方法,可以使用它的无参构造方法、树的模型、树结点、Hashtable、数组或向量来创建一棵树。

treeModel和DefaultTreeModel:

treeModel接口代表整棵树。不像ListModel或TableModel,TreeModel不直接存储或管理树的数据。treeModel包含数的结构化信息,而树的数据则由TreeNode存储和管理。

TreeNode、MutableTreeNode和DefaulMutableTreeNode:

treeModel表示整棵树,而TreeNode存储树中的一个结点。MutableTreeNode定义了TreeNode的子接口,它增加了许多方法,这些方法可以改变结点的内容、插入和删除孩子结点、设置新的父结点以及删除结点本身。

DefaulMutableTreeNode是MutableTreeNode的一个具体实现,它用一个向量来维护孩子结点的列表,并且提供许多操作,这些操作包括创建结点、检查和修改结点的父结点和孩子结点,还可以检查结点所属的树。通常情况下,应当使用DefaulMutableTreeNode创建树结点。

TreePath和TreeSelectionModel:

JTree类包含用于选择树路径的方法。TreePath类表示树中从某个祖先结点到它的一个后代结点的一条路径。

TreeSelectionModel支持三个选择模型:连续选择、不连续选择和单项选择。单项选择只允许选择一项。连续选择允许选择多项,但选定的条目必须是连续的。不连续选择是最灵活的,它在给定的时间内允许选择任意多项。默认的树选择模式是不连续的。要设置选择模式,可以使用TreeSelectionModel中的setSelectionMode(int mode)方法。这三种模式的常量是:

① CONTIGUOUS_TREE_SELECTION

② DISCONTIGUOUS_TREE_SELECTION

③ SINGLE_TREE_SELECTION

五:树结点的绘制和编辑

JTree将结点的绘制任务委托给绘制器。所有的绘制器都是TreeCellRenderer接口的实例,该接口只定义一个名为getTreeCellRendererComponent的方法,如下所示:

public Component getTreeCellRendererComponent
  (JTree tree, Oblect value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus);

通过实现TreeCellRenderer接口或者使用DefaulTreeCellRenderer类,能够创建自定义的树单元格绘制器。

JTree附带一个默认的单元格编辑器。

树事件:

在众多事件中,JTree可以触发树的选择事件TreeSelectionEvent和树的展开事件TreeExpansionEvent。无论何时,只要选择一个新结点,JTree就触发TreeExpansionEvent事件。无论何时,只要展开或折叠一个结点,JTree就触发TreeExpansionEvent事件。