有了JDBM,我们就有了一个简单的、用于ToDoTask程序的保持层,而不需要一个很复杂的东西——整个JDBM库,jdbm.jar是一个88K的jar文件,你可以在JDBM网站上找到它。
表格的表示
人们总希望带有表格组件的应用程序能够通过点击表格的标题栏来按顺序显示表格内容。让一些人意外的是,Swing工具箱里没有内置相应的功能来支持它。这其中最奇怪的地方是Sun公司事实上向人们提供了表格排序功能。Sun的JavaDocs指向可扩展的Sun Java在线教程。如果点击JTable链接,你会进入一个教程,除了在文本里讲到很多[还未最终确定]的东西外,它最终会提到TableSorter类,你可以在http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/TableSorter.java找到它。
现在TableSorter是一个修饰符模型,能够包装已有的TableModel,并增加了排序功能,而不需要更改底层的TableModel。它不会保存表格的内容;它只负责如何给内容进行排序,把调用与已包装的模型进行映射。在ToDoTasks程序里,我们有TasksModel,它不需要排序就能够对Tasks class进行简单的查看。在TasksFrame类里,一旦我们创建了图形用户界面(GUI),就调用Controller来获取TasksModel,然后把它设置为JTable模型。
TasksModel tasksModel;
...
tasksModel=controller.getTasksModel();
tasksTable.setModel(tasksModel);
要合并TableSorter我们首先需要把TaskModel包装在TableSorter里,然后把sorter设置为JTable的参数,就像下面这样:
TasksModel tasksModel;
TableSorter sorter;
...
tasksModel=controller.getTasksModel();
sorter=new TableSorter(tasksModel);
tasksTable.setModel(sorter);
由于还有一件事要做,所以我们为sorter保留了一个句柄,把sorter交给JTable的表格标题,这样它能够在里面单步调试,并加入鼠标事件侦听程序,让标题触发排序行为:
sorter.setTableHeader(tasksTable.getTableHeader());这就行了。你现在有了一个Jtable,它支持点击标题就在不排序、升序和降序之间切换的功能。它还支持通过按住Control键并点击标题来排序的二级数据列。是的,就这么简单,所以你会奇怪为什么TableSorter没有成为Swing里正式的一部分。
本月,我们将提供一个更快建立原型的提示。当你把它们放在表格里表示、让它们把一个enum值正反翻译成string时,你会发现自己完全是在浪费时间来处理枚举。在ToDoTasks应用程序里,任务的优先顺序在Priority.java里被表示为一个Java 5.0 enum,就像下面这样:
enum Priority {
NONE(0),LOW(1),MEDIUM(2),HIGH(3),CRITICAL(4);
Priority(int priority) { this.priority=priority; }
final int priority;
}
现在,为了迅速让它出现在表格里,并带有名字,你可以自己为表格编写一个单元格生成器来翻译enum值。由于enums现在是正确的对象,所以我们可以告诉JTable使用其默认的设置来生成这个值,所生成不是数值,而是enum值的名字。
为了允许对值进行编辑,我们可以再次自己编写一个CellEditor来完成这一任务。但是只需要3行代码就能够让这个编辑器获得所有的enum值。要得到enum所有的值,你可以调用它的values方法。这会返回一个按照enum值被公开的顺序进行排列的数组。一旦在TasksFrame里创建好了JTable,我们就可以用JcomboBox创建一个DefaultCellEditor:
DefaultCellEditor priorityEditor=new DefaultCellEditor(new JComboBox(Priority.values()));我们用来自Priority的值的数组初始化JcomboBox。出于可用性的考虑,我们将CellEditor设置为需要两次点击才能够开始编辑单元格:
priorityEditor.setClickCountToStart(2);如果我们把它设置为一次点击的话,那么我们就很难选择使用该单元格的行了,因为它会立即显示一个combobox菜单来更改它。最后一步是告诉表格每当它在单元格里看到Priority的值,就要使用我们新的编辑器:
tasksTable.setDefaultEditor(Priority.class,priorityEditor);现在我们就有了一个复合工具框编辑器,它会在enum出现在代码时候显示它们的名字;在你创建原型的时候,这会节省大量的时间。
下个月,我们将讨论一个基于Web的ToDoTasks程序。
DJ Walker-Morgan是一名开发咨询师,专长是Java、用户对用户的消息发送和视频会议。
责任编辑:张琎
用户评论