服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

swing 第三方工具设计

    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里面的接口方法。

swing 第三方工具设计(图一)

现在就以这种思想去设计一个功能类,我们就以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)      

排序方法主要还是用到和数据相关的方法为主,并且涉及以下技术点:

  1. tableheader,因为触发排序事件的ui是列的ui代表,其ui代表通过一个类来实现排序图标的绘画,本人倾向于用代码绘画图形,这样有机性会比图片要高.
  2. 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);    }}      

swing 第三方工具设计(图二)

作者简介


    郭?觯?广州某软件企业桌面程序框架设计师,您可以通过_gtm_@163.com和作者取得联系,他很乐意和你探讨一切关于swing/awt,java2d,java3d以及各种开发gui框架的问题。

扫描关注微信公众号