- 浏览: 445436 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
进退取舍:
谢谢,这个用上了!!
Java 一个线程池的示例 -
pb_water:
感谢楼主,打算买楼主的书,支持一下,楼主功德无量
JavaScript内核系列第0版整理稿下载 -
lancezhcj:
有图会直观的多呢,再摸索摸索
有限自动机与建模 -
hsmsyy:
这里应该是原创了吧,楼主我觉得闭包的作用:实现面向对象。有待商 ...
JavaScript内核系列 第7章 闭包 -
wll52:
在应用退出之前,需要释放连接 con.disconnect() ...
使用smack与GTalk通信
前言
以前开发过一些简单的UI程序,大多都是借助IDE完成所有的工作,比如用DELPHI,或者C++ Builder等构筑,在这些工具中,UI是很容易开发的,但是在Java中就不一样了。Swing,在计算机科学界来说,其设计思想,整个体系的内涵,都是无以伦比的,但是要快速的用Swing开发一个能用的程序出来,还是比较困难的,其一,没有一个IDE支持(netbeans的高版本确实可以支持,但是,你对其Swing Application Framework不熟悉的话,开发出来的东西,你自己都不清楚所有细节),其二,貌似Swing的资料比较难找,找到的也大多是写不忍卒读的,即使想学也没有办法。
长期进行Java开发,UI部分还真没有涉及过,大多是WEB方面的,所以就找机会自己补习补习,关于Swing的资料,国外的好像比较多,而且也比较好,特别是Sun的员工的博客,确实不一般,如果英文过的去,就赶紧找找RSS订阅。
总体设计
先看下效果:
Todo-list
新建一个Task
stodo(http://code.google.com/p/stodo/)是我最近学习swing的一个总结,也算是个可以用的小软件,尽管不是很好用,呵呵。
stodo内部使用sqlite作为数据存储,一来为了小巧,二来数据库配起来比较麻烦,这个好,不要用户名密码,但是对数据的存取都是通过标准的SQL语句,很方便。
主要用到JList控件,对JList的ListCellRenderer进行定制,使得这个List的Cell比较漂亮,然后对List的DataModel进行扩展,使得List中的数据为我们需要的数据类型。通过这些的定制,发现Swing的设计思想确实很了不起,框架很清晰,以后做UI框架,最好还是学习Swing的这一套机制。
部分实现
好了,我们来看看实现的部分代码,如果要所有的源代码,可以去(http://code.google.com/p/stodo/)下载。
经验来看,做UI还是用IDE帮忙,我的界面中元素的布局都是用netbeans的UI设计器来设计的,然后将之CC到应用框架中即可。
public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable(){ public void run() { ListMainFrame lMain = new ListMainFrame("My todo list"); lMain.initUI(); } }); }
在主入口处,创建TodoList的主界面,绑定菜单:
public void initUI(){ try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(Exception e){ System.err.println(e.getMessage()); } systemTray = SystemTray.getSystemTray(); try { trayIcon = new TrayIcon(ImageIO.read(new File("imgs/icon.png"))); systemTray.add(trayIcon); } catch (IOException e) { e.printStackTrace(); } catch (AWTException e) { e.printStackTrace(); } addWindowListener(new WindowAdapter() { public void windowIconified(WindowEvent e) { dispose(); } }); trayIcon.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) setExtendedState(NORMAL); setVisible(true); } }); //get todo-items from embedded database TodoItemListBuilder builder = new TodoItemListBuilder(); List<TodoItem> tlist = builder.getTodoItems(); TodoListModel listModel = new TodoListModel(); for(TodoItem item : tlist){ listModel.addElement(item); } todolist = new TodoList(listModel); todolist.setCellRenderer(new TodoListCellRenderer()); todolist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); JScrollPane sp = new JScrollPane(todolist); todolist.addMouseListener(new ListItemListener()); JMenuBar mbar = new JMenuBar(); JMenu fileMenu = new JMenu("File"); JMenuItem newTask = new JMenuItem("New task", new ImageIcon("imgs/schedule_new.gif")); newTask.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK)); newTask.setIconTextGap(4); newTask.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(newTaskDialog == null){ newTaskDialog = new NewTaskDialog(ListMainFrame.this, "New Task"); } newTaskDialog.setVisible(true); } }); JMenuItem exit = new JMenuItem("Exit", new ImageIcon("imgs/close.gif")); exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F4, InputEvent.ALT_MASK)); exit.setIconTextGap(4); exit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { int y = JOptionPane.showConfirmDialog( null, "Confirm exit", "Confirm Exit Dialog", JOptionPane.YES_NO_OPTION); if(y == JOptionPane.YES_OPTION){ System.exit(0); } } }); fileMenu.add(newTask); fileMenu.add(exit); JMenu editMenu = new JMenu("Edit"); JMenuItem exportText = new JMenuItem("Export Text", new ImageIcon("imgs/exptotext.gif")); JMenuItem exportExcel = new JMenuItem("Export Excel", new ImageIcon("imgs/exptoexcel.gif")); editMenu.add(exportText); editMenu.add(exportExcel); mbar.add(fileMenu); mbar.add(editMenu); setJMenuBar(mbar); getContentPane().add(sp); setSize(400, 650); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setLocationRelativeTo(null);//center of the screen setVisible(true); }
在JDK6中,用Swing开发桌面应用,比如调用浏览器,邮件客户端等都已经很容易,这里用到了系统托盘,这个也是JDK6中新添加的,可以使应用程序显得更加专业。
当添加一个新的task的时候,stodo先将记录插入数据库,然后更新主界面的JList的dataModel,Swing很好的做使用了MVC框架,更新了数据模型dataModel以后,控制器会自动更新JList。
另一个比较隐晦的问题是,当你自定义渲染器为List的Cell提供渲染的时候,你会发现,你在渲染器中绑定的事件会失效,因为JList会将这些事件处理,而不会继续传递,这就需要自己为鼠标绑一些事件处理(目前还没有找到更好的解决方法,如果你有好办法,请分享,谢谢)。
class ListItemListener extends MouseAdapter{ public void mouseEntered(MouseEvent e){ JList list = (JList)e.getSource(); int index = list.locationToIndex(e.getPoint()); TodoItem item = (TodoItem)list.getModel().getElementAt(index); String tooltip = "Desc : "+item.getDesc()+ ", Status : "+item.getStatus()+ ", Timeout:"+item.getTimeout(); list.setToolTipText( "<html>"+tooltip+ "</html>" ); } public void mouseExited(MouseEvent e){ JList list = (JList)e.getSource(); list.setToolTipText(""); } public void mouseClicked(MouseEvent e){ if(e.getClickCount() == 2){ JList list = (JList)e.getSource(); int index = list.locationToIndex(e.getPoint()); TodoItem item = (TodoItem)list.getModel().getElementAt(index); EditTaskDialog editTaskDialog = new EditTaskDialog(ListMainFrame.this, "Edit exist task", item); editTaskDialog.setVisible(true); } } }
注意:这里摘录的都是一些代码片段,尽量给出解释,要看完整的代码,请参考上文。
后记
Swing非常强大,非常灵活,如果能基于现有的框架进行一个更高层次的封装,则可以更方便,易用。Swing的定制功能令人惊叹,这种哲学和*nix下的编辑器,shell等都是一脉相承的。
评论
如果需要在第一行加一个标题栏,估计就要换成JTable去做了。
如果不用JTable,能否实现第一行是一个标题栏呢!???
而且还有一个问题不支持中文路径。
现在项目中的代码就是0.5的源码了,直接用svn check就可以了。中文路径我没有测试过,我下来再测试下。谢谢你的提醒。
而且还有一个问题不支持中文路径。
嗯,确实,NetBeans的UI设计器是很好用的,我的很多控件都是用它来做布局设计的,如果有时间应该把SAF也好好研究研究,SAF对资源管理(多语言),EDT的管理(Swing假死)等都已经做了一个包装,用起来会很方便,自己写不但费事,而且容易出错。
NetBeans有用到他自己的Layout吗?
不过还是自己写的好, 这UI代码真是乱。。。
PS: 能否在在源码中贴上依赖的jar文件,好好向楼主学习一下,希望有机会和楼主一起完善这款小软件。
非常抱歉,上次有个朋友也要我贴上jar,不过一直忙,一定会贴出来的。Task在这个版本中不能直接删除,只是在列表中删掉了,数据库中的没有去做。谢谢。
PS: 能否在在源码中贴上依赖的jar文件,好好向楼主学习一下,希望有机会和楼主一起完善这款小软件。
嗯,数据操作部分确实有些问题,v0.3可能稍微好一些,我现在正在完善(导出,插件机制)。
么子是鸡肋呢?
嗯,确实,NetBeans的UI设计器是很好用的,我的很多控件都是用它来做布局设计的,如果有时间应该把SAF也好好研究研究,SAF对资源管理(多语言),EDT的管理(Swing假死)等都已经做了一个包装,用起来会很方便,自己写不但费事,而且容易出错。
我只学了swing的一点皮毛,虽然swing还是经常被一些程序员嘲笑。
发表评论
-
JavaScript内核系列 第15章 服务器端的JavaScript
2012-02-12 21:39 2214第15章已经在icodeit上发布,这一章分为上/下两篇,请朋 ... -
使用vim开发python及graphviz绘图
2011-12-23 14:49 6341基本需求 使用vim中的autocmd命令可以很容易的将正在 ... -
Java脚本技术应用实例
2011-01-22 11:24 4094前言 一直以来都很喜欢可以自由扩展的软件,这一点应该已经在很 ... -
可编程计算器(phoc)的设计与实现
2011-01-17 11:34 1865前言 借助JavaScript脚本 ... -
函数式编程(javascirpt)
2009-04-18 22:18 1217前言 Javascript,有人称 ... -
C和指针
2009-05-21 23:15 1061前言 指针是C的灵魂,正是指针使得C存在了这么多年,而且将长 ... -
C和指针(续)
2009-05-25 23:41 1317前言 上一篇《C和指针》可能对关于C和指针的有些内容没有说透 ... -
有限自动机与建模
2009-06-06 10:48 1649前言 在学校学程序设计语言的时候,能接触到的所有例子没有一个 ... -
事件和监听器
2009-06-21 22:06 1370前言 事件监听器是经 ... -
基于总线的消息服务(BBMS)的设计与实现
2009-07-25 22:19 1311前言 异步事件的通知机制在比较有规模的软件设计中必然会有涉及 ... -
JavaScript内核系列 第9章 函数式的Javascript
2010-05-13 19:20 3714第九章 函数式的Javascript 要说Ja ... -
JavaScript内核系列 第8章 面向对象的JavaScript(下)
2010-05-06 09:40 3593接上篇:JavaScript内核系列 第8章 面向对象的Jav ... -
JavaScript内核系列 第8章 面向对象的JavaScript(上)
2010-05-06 09:26 2848第八章 面向对象的 Javascript ... -
JavaScript内核系列 第7章 闭包
2010-05-04 08:48 3776第七章 闭包 闭包向来给包括JavaScript程序 ... -
JavaScript内核系列 第6章 正则表达式
2010-04-27 19:44 3945第六章 正则表达式 正则表达式是对字符串的结构 ... -
JavaScript内核系列 第5章 数组
2010-04-24 15:17 4378第五章 数组 JavaScript的数组也是一个比较 ... -
Swing小应用(Todo-List)之三
2010-04-22 20:47 2066前言 去年9月份开发的那个小工具sTodo,只是做到了能用, ... -
JavaScript内核系列 第4章 函数
2010-04-18 17:31 4964第四章 函数 函数,在C语言之类的过程式语言中 ... -
JavaScript内核系列 第3章 对象与JSON
2010-04-12 09:12 6021第三章 对象与JSON JavaScript对象与传 ... -
JavaScript内核系列 第2章 基本概念
2010-04-03 19:44 5522第二章 基本概念 ...
相关推荐
todo-list(模块化,组件化)
“TODO-LIST”是一个任务列表,不同于其它的 TODO-LIST 产品,该项目没有具体的“时间”概念,其它 TODO-LIST 基本都是以“时间点”为一个单位,就像“什么时间点之前该完成什么任务”,这不像一个任务列表,这更像...
小案例——todo-list以及单测
Todo-list-源码.rar
todo-list-serverless-源码.rar
:sparkles:一个使用 electron + vue + electron-builder 开发的跨平台 todolist(便签)桌面应用 相关技术 ...... 功能预览 步骤 npm install npm run electron:serve npm run electron:build 下载 releases:...
Vue基础语法写todo-list案例
todo-list案例最终版本
swiftui项目实战,todo-list
eventuate-examples-java-spring-todo-list, 使用Eventuate构建的Java和 Spring Boot Todo列表应用程序 待办事项列表示例应用程序it演示如何使用平台编写具有 microservices体系结构的应用程序,使用事件源Sourcing...
Ajax-ToDo-List.zip,简单待办事项列表,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下更改。
Ajax-ajax-todo-list.zip,客户端渲染SPA(单页应用程序)实践。这个项目使用ajax来发送请求,node.js来处理api。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它...
$ cd eth-todo-list eth-todo-list~$ npm install eth-todo-list~$ truffle compile eth-todo-list~$ truffle migrate eth-todo-list~$ npm run dev 笔记: 开始安装之前,请确保已安装Ganache与本地区块链进行交互...
TODO-list.zip,待办事项APP,纯kotlin开发,接口是鸿洋大大提供的,[地址](http://www.wanandroid.com/blog/show/2),并且我还加入了番茄时间,高效利用好时间.
克隆项目并运行此命令sudo npm install -g或sudo npm install -g nickleus73/todo-list 创建待办事项 todo-list -t "My TODO" 阅读待办事项列表 todo-list -r 显示(每个待办事项换行): #1 - First todo #2 - ...
本资源详细记录了一个用redux开发的todo-list实例实践的过程。通过本实例,可以学习到: 1. Redux的核心思想; 2.Redux的三大概念; 3.React+Redux的开发方法和流程;
待办事项列表 Todo-list 启动一个服务器来查找 TODO、FIXME 和 NOTEs,将它们呈现在一个界面中,让您可以按受让人和文件进行排序。 服务器还将显示代码片段。作为应用程序使用Todo-list 可以作为应用程序安装和使用...
todo-list:一个简单的待办事项清单
qeephp 入门 example-todo-2009-06-18.zip下载 qeephp 入门 example-todo-2009-06-18.zip下载
koa-todo-list ...这是一个基于koa的todo小demo 克隆 git clone https : //github.com/qianlongo/koa-todo-list.git 安装 cd koa - todo - list && npm install 跑 gulp 预习 localhost: 3000 效果