基本的selector接口
日期选择类的核心是date_selector_panel.仔细分析后,首先做了一些如下变量声明,不要被"常量初始化"语法掷出。(以为括号中的代码是静态的,和其他没有任何联系.)实例初始化声名使用this的结构避免了在构造器中连接另一个构造器。他们提供了保证在每个构造器都能有效调用的初始化方法。同时在一个地方给出所有的初始化代码也是非常方便的。散布在各个地方的没有初始化的变量很容易引起运行错误。当移动代码到构造器中也是非常困难的,因为移动过程中你必须考虑你已经改变的2个地方。比如说,在下面日历声明中代码就是实例初始化:
public class date_selector_panel extends jpanel implements date_selector
{
//这些字符串应该应该在资源包中,因此它们是国际化的。
private string[] months =
{ "jan","feb", "mar","apr", "may","june",
"july","aug","sept","oct","nov","dec"
};
private static final int days_in_week = 7, // 一个 星期的天数
max_weeks = 6; // 在一月中最大的//星期数。
// 用户选择的日期
private date selected = null;
private calendar calendar = calendar.getinstance();
{ calendar.set( calendar.hour, 0 );
calendar.set( calendar.minute, 0 );
calendar.set( calendar.second, 0 );
}
//显示在屏幕上的当前日期
private final calendar today = calendar.getinstance();
下面便开始处理点击不同天的事件。我采用比较容易实现的外观即将每天都以一个标签是日期的按纽显示在屏幕上,我定义了一个简单的监听对象并加载到每个按纽中。由监听对象获取按纽标签值,由标签值可以得到日期与日历的位置,然后它将从日历中获取日期对象并且将日期字符串发送给监听器(通过调用fire_actionevent()的方式)。
//一个监听器适合所有calendar事件
private final button_handler day_listener = new button_handler();
private class button_handler implements actionlistener
{ public void actionperformed(actionevent e)
{
if (e.getactioncommand().equals("d"))
{ string text = ((jbutton) e.getsource()).gettext();
if(text.length() > 0) // <=0 means click on blank square. ignore.
{ calendar.set
( calendar.get(calendar.year), // reset the calendar
calendar.get(calendar.month), // to be the chosen
integer.parseint(text) // date.
);
selected = calendar.gettime();
fire_actionevent( select_action, selected.tostring() );
}
}
}
}
private actionlistener subscribers = null;
public synchronized void addactionlistener(actionlistener l)
{ subscribers = awteventmulticaster.add(subscribers, l);
}
public synchronized void removeactionlistener(actionlistener l)
{ subscribers = awteventmulticaster.remove(subscribers, l);
}
private void fire_actionevent( int id, string command )
{ if (subscribers != null)
subscribers.actionperformed(new actionevent(this, id, command) );
}
//这里使用它是一个入口去发送初始化actionevent到支持标题的任何实体。
public void addnotify()
{
super.addnotify();
int month = calendar.get(calendar.month);
int year = calendar.get(calendar.year);
fire_actionevent( change_action, months[month] + " " + year );
}
--");
days[i] = day;
day.setborder (borderfactory.createemptyborder(1,2,1,2));
day.setfocuspainted (false); // cannot get focus
day.setactioncommand ("d");
day.addactionlistener (day_listener);// our single listener
day.setopaque (false);
// transparent background
}
}
private void update_calendar_display()
{
setvisible(false); // improves paint speed and reduces flicker.
clear_highlight();
// the buttons that comprise the calendar are in a single
// dimensioned array that was added to a 6x7 grid layout in
// order. because of the linear structure, it's easy to
// lay out the calendar just by changing the labels on
// the buttons. here's the algorithm used below:
//
// 1) find out the offset to the first day of the month.
// 2) clear everything up to that offset.
// 3) add the days of the month.
// 4) clear everything else.
int month = calendar.get(calendar.month);
int year = calendar.get(calendar.year);
fire_actionevent( change_action, months[month] + " " + year );
calendar.set( year, month, 1 ); // first day of the current month.
int first_day_offset = calendar.get(calendar.day_of_week); /* 1 */
assert calendar.sunday == 0;
assert first_day_offset < days.length;
int i = 0;
while( i < first_day_offset-1 ) /* 2 */
days[i++].settext("");
int day_of_month = 1;
for(; i < days.length; ++i ) /* 3 */
{
if( calendar.get(calendar.month)==today.get(calendar.month)
&& calendar.get(calendar.year )==today.get(calendar.year )
&& calendar.get(calendar.date )==today.get(calendar.date ) )
{ highlight( days[i] );
}
days[i].settext( string.valueof(day_of_month) );
calendar.roll( calendar.date, /*up=*/ true ); // forward one day.
day_of_month = calendar.get(calendar.date);
if( day_of_month == 1 )
break;
}
// note that we break out of the previous loop with i positioned
// at the last day we added, thus the following ++ *must* be a
// preincrement because we want to start clearing at the cell
// after that.
while( ++i < days.length ) /* 4 */
days[i].settext("");
setvisible(true);
}
private jbutton highlighted = null;
private void clear_highlight()
{
if( highlighted != null )
{ highlighted.setbackground( color.white );
highlighted.setforeground( color.black );
highlighted.setopaque(false);
highlighted = null;
}
}
private void highlight( jbutton cell )
{
highlighted = cell;
cell.setbackground( com.holub.ui.colors.dark_red );
cell.setforeground( color.white );
cell.setopaque( true );
}
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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器