选择显示字体大小

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

摘要:java toolbox 专栏中有该组件显示日历并通过单击选择日期的使用指南。它使用了“四人帮”设计模式,是此种模式的好例子;这篇文章同时注重日期组件与decorator 模式的说明。相关代码演示了如何使用java.util.calendar类和用自定义框架和标题栏来构造小swing对话框的方法。(作者:allen holub)
   当你构造客户端图形用户界面时,每隔几月便会出现的日期选择问题 。不幸的是java并没有提供datachooser 等类,且在最近一项web研究中我发现data-selection组件略显笨重,我想让它变的简洁,易用。图 1 显示了该文章中类的几个变量,以便让你明白我说的在显示级别上的简洁的意思了。


图一  表示data_selector对象的不同方式


  免费网上获取方法是“一份耕耘,一份收获”原则的最好例子。可以将业余代码重写,使其成为有益代码。该文章的例子,是来自于网上,经过我的修改、整理,保留了很多原始代码,而整个结构也发生改变(或者,我该说,我只是为原来无组织的大量java代码增加了框架而此),这就是"免费"的好处。
  此组件还提供了一个好的 decorator 设计模式的演示并很好的探究了 java 的 calendar 类,另外,他也展示了如何在swing jdialog中如何实现你的标题栏和框架

decorators

   和其他复杂问题一样,通过将大问题分成许多容易实现(和测试)的小问题来大大简化解决过程。decorator 模式就是这样的一个很好的方法。
  如果你用过java的i/o类,那你就看到过 decorators  。比如:快速有效的读取经过压缩的字节流是个复杂问题,可通过将一个大的类实现分解成3个独立的子问题:
1,读字节
2,通过缓冲快速有效的读取
3,压缩字节流
java 使用fileinputstream 解决第一个问题.如下面所示:

try
    {   inputstream in = new fileinputstream( "file.name" );
    }
    catch( ioexception e )
    {   system.err.println( "couldn't open file.name" );
        e.printstacktrace();
    }
  
   然后你可以使用修饰(或外包装) 策略增加缓冲。使用可缓冲字节的 inputstream 实现器来包装inputstream对象。然后你为每个字节进行包装,许多字节成为一包装流,并返回首字节。这种decorator 包装过程如下:

try
    {   inputstream in = new fileinputstream( "file.name" );
        in = new bufferedinputstream( in );
    }
    catch( ioexception e )
    {   system.err.println( "couldn't open file.name" );
        e.printstacktrace();
    }
  
   另一个实现压缩的decorator:
  
try
    {   inputstream in = new fileinputstream( "file.name" );
        in = new bufferedinputstream( in );
        in = new gzipinputstream( in );
    }
    catch( ioexception e )
    {   system.err.println( "couldn't open file.name" );
        e.printstacktrace();
    }

    当然你也可以通过增加更多的 decroators 来实现过滤功能。

   这种解决方法是很灵活的,你可以整合与细化你所需的。更重要的是,因为每个decorator 只解决一个单一的问题,所以每个都相对容易实现。因此,decorator 是很容易在不影响系统其他部分进行编写,调试与修改。比如,我能够通过重写bufferedinputstream来改变缓冲法则,而不与其他 decorator (或用到它们的其他代码)相关;我也能通过实现新的decorator 来简单地添加新的过滤功能。(如cipherinputstream类已能过这种方法被添入到java类库中)。

日期选择 (date-selection)的核心问题

在date-selection 问题中我使用了decorator 的原则。核心问题是显示一月的日历。因此我首先做只实现该功能的一个类。
图2显示了date_selector_panel用户界面,它只是一个日历,因为无须写一些无关代码 ,所以很容易实现。"今天"高亮度显示。如要选择一日期只需在其上面单击。(当你选择一日期的时候,存储了该组件的 actionlistener对象就会被激活。),背景默认透明,因为window窗体是灰色的所以它在这里显示的也是灰色的。

  图2,一个原始的日期选择面板,无参数构建器
          
可以通过几种方法来“装饰”原始的日期选择器,使其更加有用。首先,你能在低端增加导航条(如图 3 所示),能通过单箭头、双箭头向前或向后移动月、年。
    
     图 3 。增加导航
   通过使用包装原始的日期选择面板的decorator 对象增加导航条。由于包装与面板都继承于data_selector接口,因此可交换地使用他们。下面的代码创建了如图3所示的装饰的日期选择器。
date_selector selector = new date_selector_panel();
selector = new navigable_date_selector( selector );


创建包装的日期选择面板(date_selector_panel)的通用构建器,也可以实现相同的效果:
date_selector selector = new navigable_date_selector();
提供另外一个参数是在日历中显示当前年与月的主题(见图4)
  
   图 4 添加一主题。
  和前面一样使用同样的decorator 策略来增加名称:
date_selector selector = new date_selector_panel();
selector = new navigable_date_selector( selector );
selector = new titled_date_selector   ( selector );

   在上面的代码中,省略第二行便会取消导航条。如果你需要标题和导航条,他们的次序是无关紧要的 。直接的构造如下也可以生成没有导航条的日历选择器:
date_selector selector = new titled_date_selector();


最后要做的是如图5所示的小弹出框,能通过标题栏拖拽(也可以把该功能屏蔽)和通过单击右上角关闭按钮关闭。
  
    图 5 date-selection 对话框
和前面一样,通过decorator  来生成一个对话框。
date_selector selector = new date_selector_panel();
selector = new navigable_date_selector( selector ); // 增加导航条

date_selector_dialog popup = new date_selector_dialog( selector );
//...
date = popup.select();  // 返回用户选择日期,如果没有选择就关闭对话框则返回空值

                  

// 你也可以这样做:

popup.setvisible( true );           // 弹出,
date = popup.get_selected_date(); //获取选择日期
注意因为你用对话框标题栏所以这里你不需要在标题中整合。和上面一样,date_selector_dialog定义了一个快速实现如图5的带有导航的对话框的构造器:
date_selector = new date_selector_dialog();


早期任何例子都是创建当前月日历。几种不同的方法通过编程来改变日期。大部分工作方式都如java.util.calendar类相似的方法。

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