- 浏览: 452335 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
进退取舍:
谢谢,这个用上了!!
Java 一个线程池的示例 -
pb_water:
感谢楼主,打算买楼主的书,支持一下,楼主功德无量
JavaScript内核系列第0版整理稿下载 -
lancezhcj:
有图会直观的多呢,再摸索摸索
有限自动机与建模 -
hsmsyy:
这里应该是原创了吧,楼主我觉得闭包的作用:实现面向对象。有待商 ...
JavaScript内核系列 第7章 闭包 -
wll52:
在应用退出之前,需要释放连接 con.disconnect() ...
使用smack与GTalk通信
前言
用过vim, emacs的人都知道,这两个工具中都有很好用的增量搜索(incremental search )功能,所谓增量搜索,就是随着你的关键字的输入,结果在不断的进行刷新匹配,现在的很多web搜索框都提供类似的功能,最著名的当然是Google的,速度快,匹配率比较高(要不然也不会令人“心神不宁”了,哈哈)。
最近开发的那个小型的todo管理软件stodo
, 其中涉及到todo list的search问题,也想使用这种增量搜索的功能,后来在sun的一篇文章中找到了相关的主题,就在stodo中实现了下,大家可以参考参考。sTodo
现在仍在开发中,随着进度,可以学到很多Swing的内在技巧或者说用法,我会陆续将之整理出来。(如果没有听说过sTodo,请参看上一篇文章:Swing小应用(Todo-list)
)
效果及实现
|
|
效果如图所示,下边我们来看看大概说下原理,一般来说,我们需要一个搜索框,来对列表中的元素进行搜索,Swing采用MVC模式,所以实现起来比较容易,而且代码结构也更为直观,当搜索框中的内容发生变化时,我们需要对类表中的对象进行遍历,如果有匹配,将这些匹配的item放入一个临时的List中,而列表中原来的对象不做更改(那样,当搜索条件为空的时候,显示整个列表)。
每一个JInputField都是一个Document,Document上可以注册监听器,当JInputField内容发生变化时,通知List的datamodel进行更新,同时Swing会将更新反映在UI组件上(JList)。
先来看JList的数据模型的实现:
package org.free.todolist.model; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.Document; /** * * @author juntao.qiu@gmail.com * */ public class FilterableListModel extends AbstractListModel implements DocumentListener { private static final long serialVersionUID = -2409529218176332776L; private List<Object> list; private List<Object> filteredList; private String lastFilter = ""; public FilterableListModel() { list = new ArrayList<Object>(); filteredList = new ArrayList<Object>(); } public void addElement(Object element) { list.add(element); filter(lastFilter); } public int getSize() { return filteredList.size(); } public Object getElementAt(int index) { Object returnValue; if (index < filteredList.size()) { returnValue = filteredList.get(index); } else { returnValue = null; } return returnValue; } public void removeElement(int index){ list.remove(index); filter(lastFilter); } private void filter(String search) { filteredList.clear(); for (Object element : list) { if (element.toString().indexOf(search, 0) != -1) { filteredList.add(element); } } fireContentsChanged(this, 0, getSize()); } public void insertUpdate(DocumentEvent event) { Document doc = event.getDocument(); try { lastFilter = doc.getText(0, doc.getLength()); filter(lastFilter); } catch (BadLocationException e) { e.printStackTrace(); } } public void removeUpdate(DocumentEvent event) { Document doc = event.getDocument(); try { lastFilter = doc.getText(0, doc.getLength()); filter(lastFilter); } catch (BadLocationException e) { e.printStackTrace(); } } public void changedUpdate(DocumentEvent event) { } public void clear() { list.clear(); filteredList.clear(); } }
主要的方法是这个filter(), 当Document内容发生改变时,它会raise一个事件给父类AbstractListModel,然后AbstractListModel去更改JList的UI,从而实现过滤的功能。
List的UI组件比较简单,只需要设置好其数据模型即可:
package org.free.todolist.ui; import javax.swing.JList; import javax.swing.JTextField; import javax.swing.ListModel; import org.free.todolist.model.FilterableListModel; /** * * @author juntao.qiu@gmail.com * */ public class FilterableList extends JList { private static final long serialVersionUID = 2827679372675804255L; public FilterableList() { FilterableListModel model = new FilterableListModel(); setModel(model); } /** * register the search box on list */ public void installFilterField(JTextField input) { if (input != null) { FilterableListModel model = (FilterableListModel) getModel(); input.getDocument().addDocumentListener(model); } } /** * unregister the search box on list. */ public void uninstallFilterField(JTextField input) { if (input != null) { FilterableListModel model = (FilterableListModel) getModel(); input.getDocument().removeDocumentListener(model); } } public void setModel(ListModel model) { if (!(model instanceof FilterableListModel)) { throw new IllegalArgumentException(); } else { super.setModel(model); } } public void addElement(Object element) { ((FilterableListModel) getModel()).addElement(element); } /** * get the filterable list model of current list * @return */ public FilterableListModel getContents(){ return (FilterableListModel)getModel(); } }
如果需要完整的代码,可以到sTodo 的项目主页上下载。sTodo已经有了讨论组,如果有兴趣,欢迎加入:sTodo讨论组
后记
Swing的定制性相当高,几乎可以任意搭配,任意组合,但是灵活性高了,学习曲线就显得陡峭了,且所有的UI需要在EDT中更新,如果控制不好,很容易造成假死。
sTodo现在的版本是V0.3,基本功能已经完成,如对todo的增删改查,将某一个todo发送到指定邮箱,导出成各种格式(这个目前做的不好,代码还没有更新在SVN上),后期打算将这个项目做成一个可编程的小应用,你可以任意对其进行扩展,目前,插件部分已经基本可用,还没有移植到项目中去,等周末或者国庆长假的时候可能就可以做进去了。
评论
好的,晚上回去传吧。
不好意思,这几天没怎么上论坛,这个是地址:
http://java.sun.com/developer/JDCTechTips/2005/tt1214.html
发表评论
-
JavaScript内核系列 第15章 服务器端的JavaScript
2012-02-12 21:39 2325第15章已经在icodeit上发布,这一章分为上/下两篇,请朋 ... -
使用vim开发python及graphviz绘图
2011-12-23 14:49 6457基本需求 使用vim中的autocmd命令可以很容易的将正在 ... -
Java脚本技术应用实例
2011-01-22 11:24 4267前言 一直以来都很喜欢可以自由扩展的软件,这一点应该已经在很 ... -
可编程计算器(phoc)的设计与实现
2011-01-17 11:34 1983前言 借助JavaScript脚本 ... -
函数式编程(javascirpt)
2009-04-18 22:18 1264前言 Javascript,有人称 ... -
C和指针
2009-05-21 23:15 1117前言 指针是C的灵魂,正是指针使得C存在了这么多年,而且将长 ... -
C和指针(续)
2009-05-25 23:41 1360前言 上一篇《C和指针》可能对关于C和指针的有些内容没有说透 ... -
有限自动机与建模
2009-06-06 10:48 1786前言 在学校学程序设计语言的时候,能接触到的所有例子没有一个 ... -
事件和监听器
2009-06-21 22:06 1437前言 事件监听器是经 ... -
基于总线的消息服务(BBMS)的设计与实现
2009-07-25 22:19 1364前言 异步事件的通知机制在比较有规模的软件设计中必然会有涉及 ... -
JavaScript内核系列 第9章 函数式的Javascript
2010-05-13 19:20 3785第九章 函数式的Javascript 要说Ja ... -
JavaScript内核系列 第8章 面向对象的JavaScript(下)
2010-05-06 09:40 3672接上篇:JavaScript内核系列 第8章 面向对象的Jav ... -
JavaScript内核系列 第8章 面向对象的JavaScript(上)
2010-05-06 09:26 2906第八章 面向对象的 Javascript ... -
JavaScript内核系列 第7章 闭包
2010-05-04 08:48 3874第七章 闭包 闭包向来给包括JavaScript程序 ... -
JavaScript内核系列 第6章 正则表达式
2010-04-27 19:44 4050第六章 正则表达式 正则表达式是对字符串的结构 ... -
JavaScript内核系列 第5章 数组
2010-04-24 15:17 4530第五章 数组 JavaScript的数组也是一个比较 ... -
Swing小应用(Todo-List)之三
2010-04-22 20:47 2136前言 去年9月份开发的那个小工具sTodo,只是做到了能用, ... -
JavaScript内核系列 第4章 函数
2010-04-18 17:31 5094第四章 函数 函数,在C语言之类的过程式语言中 ... -
JavaScript内核系列 第3章 对象与JSON
2010-04-12 09:12 6132第三章 对象与JSON JavaScript对象与传 ... -
JavaScript内核系列 第2章 基本概念
2010-04-03 19:44 5688第二章 基本概念 ...
相关推荐
8. **版本控制**: 由于文件名为"ToDo-list-master",这暗示项目可能使用了Git进行版本控制,以便跟踪代码的变更历史,协同开发,并方便回溯到任何之前的版本。 通过这个项目,初学者可以学习到Java编程基础,GUI...
项目文件"ToDo-List-main"可能包含了项目的源代码、资源文件、配置文件等,通常会包括以下几个部分: 1. **源代码目录**:包含Java源文件,如主程序、任务类、用户界面组件等。 2. **资源文件**:可能包含GUI的样式...
如果是GUI应用,可能使用了Java的Swing或JavaFX库,创建按钮、文本框等组件,处理事件监听。 4. **文件存储**:为了持久化待办事项,项目需要将数据保存到磁盘。这可能通过Java的文件I/O操作实现,例如序列化对象到...
【标题】"First-TODO-App" 是一个初学者级别的项目,旨在帮助用户构建他们的第一个待办事项应用程序。这个项目通常用于教授基本的编程概念,尤其是对于那些刚刚接触 Java 编程的人。通过创建这样一个应用,学习者...
7. **Swing小应用(Todo-List)**:展示了如何使用Swing构建一个简单的待办事项列表应用,提供了基础的GUI编程示例。 8. **日志库性能比较**:比较了log4j与JDK内置的日志系统在性能上的差异,为选择合适的日志库...
Java_Database_ToDo_List是一个基于Java编程语言的项目,用于创建一个简单的待办事项管理应用程序。它结合了数据库技术,为用户提供了一个存储、管理和跟踪日常任务的平台。这个项目主要面向初学者和中级Java开发者...
// TODO Auto-generated catch block e1.printStackTrace(); } } else { JOptionPane pane = new JOptionPane("验证码错误,请重新输入"); JDialog dialog = pane.createDialog(this, "警告"); System.out....
在项目压缩包"todo_list-master"中,我们可以预期找到以下几个关键组成部分: 1. **源代码文件**:项目的核心是源代码,通常包括`.java`文件。这些文件包含了类和方法,用于实现待办事项的各种功能,如`TodoItem`...
在这个“TODO-list”应用程序中,开发者可能使用了 JList 或 JTable 组件来显示待办事项列表,JTextArea 用于输入新的待办事项,而 JButton 则用于执行添加、删除或完成任务的操作。此外,可能会有一个 JMenuBar 来...
� 由于采用了 Java 作为应用开发语言,目前可用的传统第三方应用还很少,但由于 Android 是一款完全 开 源的移动计算平台,相信第三方应用会很快的丰富起来。 � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的...
这个项目可能是为了教学目的,让学习者了解如何在Java环境下实现一个简单的待办事项(Todo List)应用。让我们深入探讨一下这个项目可能涉及的Java技术点。 1. **MVC设计模式**: "Todo List"应用通常采用Model-...
【标题】"todo_detail_app" 是一个基于Java技术开发的待办事项详情应用程序。这个项目可能是一个简单的任务管理工具,专注于展示和管理每个任务的详细信息。在Java领域,这样的应用通常涉及到面向对象编程、GUI设计...
【标题】:“TodoList2:一个基于Java的待办事项应用” 【描述】:“TodoList2是一个用Java语言开发的简单待办事项管理应用程序。它为用户提供了创建、编辑、删除和跟踪日常任务的能力,是学习Java编程以及理解面向...
// TODO Auto-generated catch block e1.printStackTrace(); } while(i) {try { list.add(rs.getString(i)); } catch (SQLException e) { e.printStackTrace(); } i++; } return list; } // public ...
在编程世界中,创建一个待办事项(Todo List)应用是学习新语言或技术的常见起点。这不仅因为其功能简单直观,易于理解,而且它能让我们快速接触到基本的用户界面、数据存储和事件处理等核心概念。本次我们将深入...
在IT行业中,待办事项清单项目(Todo List Project)是一种常见的练习或小型应用程序,它用于管理个人或团队的任务。这个项目通常用编程语言实现,比如Java,以展示基础的编程概念和软件工程实践。在这里,我们将...
压缩包子文件的文件名称为"ToDo_List-master",通常这表示源代码仓库的主分支,可能包含了项目的完整结构和源代码。 Java是一种广泛使用的面向对象的编程语言,以其跨平台能力和丰富的类库而著名。创建待办事项清单...
`TodoManager`类可能会有一个List<Todo>用于保存所有的待办事项。 3. **GUI设计**:如果项目包含了图形用户界面,那么可能会使用JavaFX或者Swing库来创建。用户可以通过界面添加、删除和查看待办事项,这涉及到布局...
`Java_final_ToDoList`是一个基于Java语言开发的待办事项(Todo List)应用程序。它展示了如何利用Java的核心特性和设计模式来构建一个实用的桌面应用。这个项目主要涉及到以下几个核心知识点: 1. **Java基础**:...