选择显示字体大小

解决日期选择问题,一劳永逸(使用decorator模式实现日期选择组件)(二)

实现日期选择

    实现了核心的日期选择面板,并将它做为一个可用decorator 模式的接口。(在i/o例子中,所有的decorate 对象都是inputstream 对象,因此可同等对待,所有的模式构造器参数都是inputstream 引 用,你可以在不知道包装对象时,用其他decorator 来包装任何一个decorator 。)

核心接口看起来像以下这样:(先不考虑 javadoc 和一些无关的代码,以便清晰的说明。更详细的代码请见resources <http://www.javaworld.com/javaworld/jw-07-2003/>)

public interface date_selector
{
    public static final int change_action = 0;
    public static final int select_action = 1;

    public void addactionlistener(actionlistener l);
    public void removeactionlistener(actionlistener l);

    public date get_selected_date();
    public date get_current_date();

    /** must work just like {@link calendar#roll(int,boolean)} */
    public void roll(int flag, boolean up);

    /** must work just like {@link calendar#get(int)} */
    public int get(int flag);
}

    date_selector接口定义了2个静态值:change_action和select_action,用于事件处理过程中(在下面将有更多例子)。接口也提供了添加与移除当选择日期时已激发的actionlistener对象的方法。最后它提供了模仿java.util.calendar()方法通过增量(年、月)来推进日历并获取属性值(如当前月份和年份)的接口.
我们返回动作监听:向按纽增加监听一样在日期选择中增加监听。

date_selector selector = new date_selector_panel();
selector.addactionlistener
(   new actionlistener()
    {   public void actionperformed( actionevent e )
        {   // do whatever you'd do to process an event
        }
    }
);

   监听策略采用的是观察者(observer)模式
  在两种情况下监听将被唤醒(actionperformed()被调用),两者区别是通过发送 actionevent  对象,并传递给actionperformed一个getid()消息。下面表进行了详细说明:

动作事件:
change_action:当日历面板改变显示的月与年(典型的就是导航条要改变)的时候发送该事件。调用event.getactioncommand.getactioncommand()去获得发生改变后的当前月与年。你也可以调用get_current_date()获取当前用户选择的日期。
select_action:当用户点击日期时发送时间,调用event.getactioncommand.getactioncommand()去获得选择日期的字符串形式。(这字符串和使用tostring()得到相同的结构。)你也可以调用get_selected_date()获取改变后当前用户选择的日期。
下面代码演示了这两种事件类型,它实现了当用户通过导航条改变月份date_selector改变标签与用户点击面板改变日期的功能:
date_selector selector = new date_selector_panel();
jlabel moth_display = new jlabel();

s.addactionlistener
(   new actionlistener()
    {   public void actionperformed( actionevent e )
        {   if( e.getid() == date_selector.change_action )
                month_display.settext( e.getactioncommand() );
            else
                system.out.println( e.getactioncommand() );
        }
    }
);

    所有实现了date_selector接口,还继承了 jpanel类(或至少说是一些 container 的衍生物)。代码要实现这个需求,以便日期选择器不用派生也可以当作一个jpanel使用,但是此时实现不了因为java.awt.container不是一个接口.对于一个方法,如果要返回一个能看为日期选择器或容器,它将必须实现这两个类,这样是非法的,而且接口(date_selector)不能继承于一个类(container)。

   这个缺陷正好是一个很好的例子:这说明了有时为何难于在已经存在而没有正确使用接口的代码上改型&quot;四人帮&quot;模式。如果是我,我重制它并将 container写成一个接口,实现 container与date_selector。(很明显,我无法改变java.*包)。这种类到接口重组是非常困难的,因为,所有的类代码不变而接口变化程序将会中断。
   引进c++风格的重载操作原因是通过重载操作&quot;new&quot;可以是重组变的容易些。这种方式你可以新建(new)一个接口并且具有默认借口类的性质。java的解决方法是生成一&ldquo;四人帮&rdquo;工厂,它是比刚才那样假想的正确做法容易多了。

ealy ,java 爱好者,matrix jsp翻译小组成员,可以点击http://www.matrix.org.cn/user_view.asp?username=ealy查看她的个人信息 


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons