基本的selector接口 日期选择类的核心是Date_selector_panel.仔细分析后,首先做了一些如下变量声明,不要被\"常量初始化\"语法掷出。
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) );
}
//在面板显示前调用addNotify()。它实际上创建了基本的图象对象,因此你可以调用super.addNotify()去调用面板。
[code]//这里使用它是一个入口去发送初始化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 );
}[/code]
然后我创建并初始化了代表天的按纽数组。有趣的是,日历并不能用二维数组表示,于是,我把按纽放在GridLayout布局中,让布局管理器来获取他的状态。在线形数组中在Grid中的第一个按钮表示第一周的第一天;第八个按纽是第二周的第一天;等等。下面是代码 :
[code]--");
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
}
}[/code]
然后便是构造器。主要工作都在这没有参数的构造器中。它创建了包含日历的面板,建立了gridlayout布局,并将按纽加入到布局中:
public Date_selector_panel()
{
JPanel calendar_display = new JPanel();
calendar_display.setOpaque(false);
calendar_display.setBorder( BorderFactory.createEmptyBorder(5,3,0,1) );
calendar_display.setLayout(new GridLayout(MAX_WEEKS /*rows*/, DAYS_IN_WEEK /*columns*/ ));
for( int i = 0; i < days.length; ++i )
calendar_display.add(days[i]);
setOpaque( false );
setLayout( new BorderLayout() );
add(calendar_display, BorderLayout.CENTER);
update_calendar_display();
}
查看本文来源