注册
 找回密码
 注册
江西广告网
查看: 2148|回复: 0
打印 上一主题 下一主题

Swing

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-3-17 08:14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
Swing是Java为桌面开发而设计一个重要GUI工具包,整个设计是基于AWT技术上的扩展。加上Java在网络的优势和跨平台的特点,Swing已经无处不在,在Java2D的性能加强,可插入式的Look And Feel,主题(Theme)和JDK5.0"Tiger"的出现后,基于Swing的技术框架如雨后春笋诞生,像Infonode,JGoooodes都是很优秀的框架。 很多用Swing开发的人员在设计GUI程序的时候,都遇上代码量大和代码逻辑复杂的问题,加上Swing的设计理论门槛相对比较高,令桌面程序的开发在国内不能流行,分析其技术原因如下: 1.Swing是MVC架构的体系,一般和用户界面相关的程序,必定触发控制器(Controler),然后在模型(Model)层相应处理,这是一般最普遍的处理,也可以说,因为Swing的V和C联系得太紧密,所以一般程序员处理数据和UI事件都以Model为入口。 2.Model要响应事件,开发人员就必须集成相应UI控件的Model,并在捕捉事件的方法里写入相应处理的代码。 基于以上的原因和界面开发的需求是千变万化的,导致模型(Model)代码量大,并且复用性低,可调试性低等问题。所以在一些UI功能添加上,对一般的桌面程序员来说可谓"百上加斤".到底我们能不能添加一些基本功能,又不影响二次开发用户的易扩展性呢? 本文旨在从以上问题出发,利用自己的实际的工作经验,从本人的Swing2CN开源项目中取出部分源代码做例子,希望点燃更多的智慧的火花。 设计一个工具能让所有用的开发人员容易扩展其控件,甚至不用添加额外的代码或者改变其设计的数据模式,是最完美的结果。到底怎么实现呢?答案是,接口。从标准的Swing控件的Model接口中的方法设计关于GUI交互的功能和改变,是不会影响二次开发人员的原有设计模式和代码。以下是我的设计思想。其中的圆圈O指的便是Model里面的接口方法。 现在就以这种思想去设计一个功能类,我们就以JTable实现列排序的功能为例子.首先,我们从TableModel知道JTable的Model基本的方法有: addTableModelListener(TableModelListener l) getColumnClass(int columnIndex) getColumnCount() getColumnName(int columnIndex) getRowCount() getValueAt(int rowIndex, int columnIndex) isCellEditable(int rowIndex, int columnIndex) removeTableModelListener(TableModelListener l) setValueAt(Object aValue, int rowIndex, int columnIndex) 排序方法主要还是用到和数据相关的方法为主,并且涉及以下技术点: TableHeader,因为触发排序事件的UI是列的UI代表,其UI代表通过一个类来实现排序图标的绘画,本人倾向于用代码绘画图形,这样有机性会比图片要高. Comparable接口,用该接口来处理排序的算法和逻辑. 代码运行设计: 让UI触发排序事件,然后通知工具类,工具类通过Model接口方法处理完排序,然后再更新UI代表.这就算完成了一次排序事件. 工具类结构设计: SortManager类构造函数就把JTable的引用带进去,这样,用户只需要生成一个SortManager对应一个JTable实例就可以添加排序功能.SortManager还提供两个带参数的构造函数,让用户能够指定哪几列或者哪一列需要排序功能. 结论 我写了一个测试类来显示这个工具类的效果,开发人员只需要一行代码就可以在无损害已经有的JTable结构下添加排序的功能,相当便利,能减少开发时间和代码量.但这个工具在极端的情况下是不适宜使用,(譬如TableHeader被指定时).所以,无绝对的通用,只有相对的通用. 测试的代码和效果如下: package org.swing2cn.test; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import org.swing2cn.table.*; public class TestSortTable extends JPanel { public TestSortTable() { init(); } private void init() { setLayout(new BorderLayout()); JTable table = new JTable(); Object[][] obj=new Object[][]{{"asdas","12321","3as3","eqw22"}, {"das2","asd","qweqw","as23"},{"aere","r32re","ewfse","werew3"}}; DefaultTableModel model=new DefaultTableModel(obj,new Object[]{"a","b","c","d"}); table.setModel(model); new KeyPlugin(table); JScrollPane scrPane = new JScrollPane(table); JButton addBtn = new JButton("新增行"); addBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); JPanel btnPane = new JPanel(); btnPane.add(addBtn); add(scrPane); add("South", btnPane); } public static void main(String[] args) { JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); frame.getContentPane().add(new TestSortTable()); frame.pack(); frame.setVisible(true); } } 结论 我写了一个测试类来显示这个工具类的效果,开发人员只需要一行代码就可以在无损害已经有的JTable结构下添加排序的功能,相当便利,能减少开发时间和代码量.但这个工具在极端的情况下是不适宜使用,(譬如TableHeader被指定时).所以,无绝对的通用,只有相对的通用. 测试的代码和效果如下: package org.swing2cn.test; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import org.swing2cn.table.*; public class TestSortTable extends JPanel { public TestSortTable() { init(); } private void init() { setLayout(new BorderLayout()); JTable table = new JTable(); Object[][] obj=new Object[][]{{"asdas","12321","3as3","eqw22"}, {"das2","asd","qweqw","as23"},{"aere","r32re","ewfse","werew3"}}; DefaultTableModel model=new DefaultTableModel(obj,new Object[]{"a","b","c","d"}); table.setModel(model); new KeyPlugin(table); JScrollPane scrPane = new JScrollPane(table); JButton addBtn = new JButton("新增行"); addBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); JPanel btnPane = new JPanel(); btnPane.add(addBtn); add(scrPane); add("South", btnPane); } public static void main(String[] args) { JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); frame.getContentPane().add(new TestSortTable()); frame.pack(); frame.setVisible(true); } } 作者简介 郭燊,广州某软件企业桌面程序框架设计师,您可以通过_gtm_@163.com和作者取得联系,他很乐意和你探讨一切关于Swing/AWT,Java2D,Java3D以及各种开发GUI框架的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表