分享
 
 
 

Swing第三方工具设计

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

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);

}

}

结论

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有