最近写了两个组件,一个是日期选择;一个是两个JList,双击其中一个的任一个Item,这个Item就会跑到另一个JList中去。这里记录下来,以便以后的修改。

来源:互联网 发布:伊斯梅尔史密斯数据 编辑:程序博客网 时间:2024/05/18 00:08

 

       日期选择组件:

1:外观:年月日也可以放在JComboBox的后面,间矩、大小、FONTCOLOR什么的都可以改,这个很容易的。

 

       2:功能:初始化就会显示电脑当前日,可以改选其它日期,若电脑日期错误,就一定会得到一个错误的日期,这点要小心。

       大小月日期的ComboBoxModel会自动变化得到正确的月天数。做法是在‘年’和‘月’的JComboBox中都添加一个ActionListener,‘年’和‘月’的改变会触发‘日’的ComboBoxModel被重置。

重置使用了一个单态方法,方法通过iDateChoose调用:

iDateChoose.setDayComboBoxModel(dayComboBox,currentYear,currentMonth);

iDateChoose来自:

private IDateChoose iDateChoose = DateChoose.getDateChooseInstance();

*********************************************************************

    一个月的天数只有31302829四种,做为公共数据,我将这四个ComboBoxModel和年、月的ComboBoxModel都放置在一个抽象类ADateChoose中,这个抽象类中还有两个不会被外界用到的内部方法:

    //闰年

    protected abstract boolean isSpecialYear(int year);

    //一月的天数

    protected abstract int daysAMonth(int year, int month);

*********************************************************************

    ‘年’、‘月’和‘日’的一个ComboBoxModel如下:年数不适用时可以很方便的做修改。

    //

    protected static ComboBoxModel yearComboBoxModel = new DefaultComboBoxModel(new String[] {

           "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016",

           "2017", "2018", "2019", "2020" });

    //

    protected static ComboBoxModel monthComboBoxModel = new DefaultComboBoxModel(new String[] {

           "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" });

    //

    protected static ComboBoxModel dayComboBox28 = new DefaultComboBoxModel(new String[] { "1",

           "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",

           "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24",

           "25", "26", "27", "28" });

 

通过继承可以很方便的直接使用以上的ComboBoxModel,在日期处理类DateChoose中不会看到数据,集中做抽象方法和对外接口的实现,这样一来,程序就OO了。

*********************************************************************

日期处理类DateChoose implements了一个接口 IDateChoose,对外开放四个方法:

//单态

    public abstract IDateChoose getDateChooseInstance();

    //set day combo box model

    public abstract void setDayComboBoxModel (JComboBox dayComboBox, int year, int month);

    //set month combo box model

    public abstract void setMonthComboBoxModel(JComboBox monthComboBox) ;

    //set year combo box model

public abstract void setYearComboBoxModel(JComboBox yearComboBox);

后两个方法没有也行,不会对组件的运行产生什么影响,但想到可能有的应用什么要求都会有,说不定一年会有十三个月,或者月份的index 0(item one)有人不想要是一月,比如学校,一般下学期二月份开学,上学期九月份开学,就会有需求说我要上学期一个MODEL二月份index 0,下学期一个MODEL九月份index 0。所以干脆一并写了。

 

DateChoose有一个私有方法:

private DateChoose(){

    }

用于做singleton,只能通过 getDateChooseInstance()方法获得DateChoose的单一实例。

 

*********************************************************************

*********************************************************************

以上权且当作是MVC中的MCV部分是用的MyEclipseSWING做的,对外提供的方法有:   public int currentYear = Calendar.getInstance().get(Calendar.YEAR);

    public int currentMonth = Calendar.getInstance().get(Calendar.MONTH) + 1;

    public int currentDay = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);

 

    public DateSelectedUnit() {

       this.initGUI();

    }

currentYearcurrentMonthcurrentDay在初始化和每次改动时会被子置值,其实也可以包装成一个DateCalendar的,看需求了,到用到时再改吧!

第二个组件没写完,应该说是写不下去了,过年回家写的,没有网找资料,写得不伦不类,自己都看不下去,花的时间算是白忙了,放弃了又很可惜,且也记下来,以后再改。

UI如下:

完成功能:双击两个JList中任一Item, 选中Item都会跑到另一个JList中。右键弹出菜单组件与响应的Dialog

       未完成功能:新数据的添加和数据编辑、删除。

 

 

左边的是targetList,右边的是fromList, 布局是两个JList放在两个JScrollPane里,两个JScrollPane放在一个JPanel中,因为还没写完,所以数据的Model都是乱加的,以后会有一个专门的模块处理数据加载。

 

所有的组件动作都由DoubleComboBoxUnitAction类处理,它有两个方法:listMouseClicked(MouseEvent evt, JList targetlist,

                     DefaultListModel fromData, DefaultListModel targetData, int index);

private void moveItem(JList list, DefaultListModel fromData, DefaultListModel targetData)

 

listMouseClicked方法中,若是左键双击,则调用moveItem方法移动Item 若右键单击,则弹出菜单,可做三个选择:add,edit and delete,这里就有一个没解决的小问题,若右键点在一个Item上,三个操作都有,若没有点在一个Item上,就只可以add。以前JTable中是完成过相同的程序的,现在?问题有:右键点在的那一行,不会被选中,得先左击一下选中,再右击。我试过如下几个方法:

targetList.setSelectedIndex(index);

targetList.addSelectionInterval(index);

targetList.setSelectionInterval(index, index + 1);

//相似的方法,JTable中有一个叫setRowSelectionInterval的可以完成。

都不行,右键就是不能选中,不能选中我删哪个?晕!有网了找找看能不能解决

 

Item的移动也有问题,最开始时出现一个IndexOutOfBoundsException,是targetList不够大,我就在向它添加Item前加一句:targetData.setSize(targetData.getSize() + 1);问题来了,有一次我多点了几次,移来移去后,两个JListItem间间隔越来越大,我在两个Item之间点了个双击,有一个空白的横条被move了!!!,我不得不在moveItem方法中做两个listDatanull遍历,把null的删去。

 

要真算的话,这个继承自JPopupMenuSelfDefinePopupMenu也算是一个组件,它的JMenuItem来自一个MenuItemList类,MenuItemList把组装好的一个泛型通过List<JMenuItem> getMenuItemList()返回,SelfDefinePopupMenu再一个一个地把JMenuItem加到它上面去,也就是把view(SelfDefinePopupMenu)controlmodel分开了。各个JMenuItem都有自己的JDialog做相应动作,如addshow一个AddDialogdelete会有一个confirmDialog等。

程序还有很多问题,没有面向接口编程,几个组件应该用Factory模式来组装,与数据库等的接口没有写等,这里先记下,毕竟桌面应用不是我的专长,各模式的应用还需要学习。我的架构师之路还很长!

 

Email: djbing@yahoo.cn

QQ:    406864638

                                          2009-2-20 18:00于家

 

原创粉丝点击