CalendarMainClass.java
package Calendar; /** * CalendarMainClass主类 * @author Administrator * @version 版本1.0 */ public class CalendarMainClass { /** * 主函数 * @param args 传入的参数 args */ public static void main(String[] args) { /** * 创建一个基于CalendarFrame的主容器fram */ CalendarFrame frame=new CalendarFrame(); /** * 设置主容器的显示位置,以及界面的高和宽数据 */ frame.setBounds(200,150,670,490); /** * 设置主容器为可见 */ frame.setVisible(true); /** * 主容器初始化年月信息 */ frame.setYearAndMonth(2016,1); /** * 设置主容器的标题 */ frame.setTitle("万年历"); } }CalendarFrame.java
package Calendar; import java.util.*; import java.awt.*; import java.awt.event.*; import java.text.SimpleDateFormat; import javax.swing.*; import javax.swing.border.*; /** * * 窗体的具体构造及执行代码 * @author Administrator * @version 版本1.0 */ public class CalendarFrame extends JFrame implements ActionListener,ItemListener{ private static final long serialVersionUID = 1L; /** * labelDay[] 存放每一天的标签数组| * titleName 显示标题栏名称的按钮| * text 输入年份的文本框| * button,button1 按钮组件| * label 标签| * comBox 下拉列表组件| * showMessage 显示日历的标签项 * */ JLabel labelDay[]=new JLabel[42]; JButton titleName[]=new JButton[7]; JTextField text; JButton button,button1; JLabel label1,label2; JComboBox<String> comBox; String name[]={"日","一","二","三","四","五","六"}; CalendarBean calendar; JLabel showMessage=new JLabel("",JLabel.CENTER); int year=2011,month=2; /** * JFrame都是Windows类的子类,因此主窗口为Windows型容器,其默认布局为BorderLayout布局 */ public CalendarFrame(){ /** * 为窗体修改自定义图标 */ Image icon=Toolkit.getDefaultToolkit().getImage("F:\\eclipse\\代码区\\Calendar\\src\\Calendar\\calendar1.png"); setIconImage(icon); /** * 创建面板(可向面板中添加组件,再将面板添加到其他容器中) */ JPanel pCenter=new JPanel(); /** * 将pCenter的布局设置为7行7列的GridLayout布局 */ pCenter.setLayout(new GridLayout(7,7)); pCenter.setBackground(Color.WHITE); /** * 向主容器中添加星期栏 */ for(int i=0;i<7;i++){ titleName[i]=new JButton(name[i]); titleName[i].setBorder(new SoftBevelBorder(BevelBorder.RAISED)); //titleName[i].setBackground(Color.green); pCenter.add(titleName[i]); } /** * 向主容器添加每个小日期标签 */ for(int i=0;i<42;i++){ labelDay[i]=new JLabel("",JLabel.CENTER); labelDay[i].setBorder(new SoftBevelBorder(BevelBorder.LOWERED)); pCenter.add(labelDay[i]); } /** * 声明calendar为calendarBean类的子类 */ calendar=new CalendarBean(); /** * 设置个组件的具体内容 * */ text=new JTextField(3); text.setText("2016"); button=new JButton("转到"); button1=new JButton("当前日期"); label1=new JLabel(" 万年历 "); /** * 设置label标签的字体大小为30px */ label1.setFont(new Font("",1,30)); /** * 创建下拉列表,并添加下拉列表选项 */ label2=new JLabel("今日:"); comBox=new JComboBox<String>(); String []a={"1","2","3","4","5","6","7","8","9","10","11","12"}; for(int i=0;i<a.length;i++) comBox.addItem(a[i]); /** * 向组件添加响应事件 */ button.addActionListener(this); button1.addActionListener(this); comBox.addItemListener(null); /** * 创建pNorth,pSouth面板 */ JPanel pNorth=new JPanel(); pNorth.setBackground(Color.cyan); JPanel pSouth=new JPanel(); /** * 向面板中添加各个组件 */ pNorth.add(label1); pNorth.add(label2); pSouth.add(button1); pSouth.add(text); pSouth.add(new JLabel("年")); pSouth.add(comBox); pSouth.add(new JLabel("月")); pSouth.add(button); pSouth.add(showMessage); /** * 将三个面板添加到以BorderLayout为布局的主Windows型容器中 */ add(pCenter,BorderLayout.CENTER); add(pNorth,BorderLayout.NORTH); add(pSouth,BorderLayout.SOUTH); /** * 向setYearAndMonth方法传入year,month的值 */ setYearAndMonth(year,month); /** * 设置,当点击窗体右上角的关闭图标时,程序会做出直接结束程序的处理 */ setDefaultCloseOperation(DISPOSE_ON_CLOSE); } /** * ------编写传入年月的方法setYearAndMonth------ * @param y 年份 * @param m 月份 */ public void setYearAndMonth(int y,int m){ calendar.setYear(y); /** * 将setYearAndMonth方法得到的year,month的值传给calendar类 */ calendar.setMonth(m); /** * 获取calendar类中getCalendar方法中的日期字符串数组,将获取的字符串数组的值传给每个labelDay小日期标签 */ String day[]=calendar.getCalendar(); for(int i=0;i<42;i++) labelDay[i].setText(day[i]); /** * 在showMessage标签中显示输出日期 */ showMessage.setText("日历:"+calendar.getYear()+"年"+calendar.getMonth()+"月"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm"); label2.setText("今日:"+df.format(new Date())); /** * 设置标签输出的字体颜色为蓝色 */ showMessage.setForeground(Color.BLUE); } /** * ---------重写actionPerformed方法--------- */ public void actionPerformed(ActionEvent e){ /** * reg为正则表达式,表示纯数字的字符串(不含其他任何与数字无关的字符) */ String reg="^[\\d]*$"; /** * 判断响应事件触发的是button组件 */ if(e.getSource()==button){ /** * 这个地方如何让程序识别并弹出对话框,而不是在未输入时直接判别程序出错 */ if(text.getText().isEmpty()){ JOptionPane.showMessageDialog(this, "您未输入年份", "消息对话框", JOptionPane.WARNING_MESSAGE); /** * 将屏幕焦点聚在text组件上 */ text.requestFocus(true); } /** * 判断text文本框中是否为纯数字,若不是则弹出对话框 "您输入了非法字符" */ else if(!(text.getText()).matches(reg)){ JOptionPane.showMessageDialog(this, "您输入了非法字符", "消息对话框", JOptionPane.WARNING_MESSAGE); } /** * 判断text文本框中是否为纯数字,若是,则输出相应年份 */ else { /** * 将文本框中得到的字符串强制转为整型值,并赋值给整型变量i */ Integer i=Integer.parseInt(text.getText()); /** * 将整型i变量中的值传递给calendar类中,并设置为year值 */ calendar.setYear(i); } /** * 判断用户是否使用了下拉列表框,若未使用,则弹出消息对话框 "您未选择月份" */ if(((String)comBox.getSelectedItem()).equals("选择月份")) { JOptionPane.showMessageDialog(this, "您未选择月份", "消息对话框", JOptionPane.WARNING_MESSAGE); /** * 将屏幕焦点聚在comBox组件上 */ comBox.requestFocus(true); } else{ /** * 将下拉列表框中选中的字符串值强制转换为整型,并赋值给整型变量j */ Integer j=Integer.parseInt(comBox.getSelectedItem().toString()); /** * 将整型i变量中的值传递给calendar类中,并设置为month值 */ calendar.setMonth(j); /** * 获取calendar类中getCalendar方法中的日期字符串数组 */ String day[]=calendar.getCalendar(); /** * 将获取的字符串数组的值传给每个labelDay小日期标签 */ for(int n=0;n<42;n++){ labelDay[n].setText(day[n]); } } /** * 在showMessage标签中显示输出日期 */ showMessage.setText("日历:"+calendar.getYear()+"年"+calendar.getMonth()+"月"); } /** * 判断响应时间触发的是button1组件 */ else if(e.getSource()==button1){ /** * --------------获取系统当前日期-------------- */ Calendar c=Calendar.getInstance(); int y=c.get(Calendar.YEAR); int m=c.get(Calendar.MONTH)+1; calendar.setMonth(m); String day[]=calendar.getCalendar(); for(int n=0;n<42;n++){ labelDay[n].setText(day[n]); } showMessage.setText("日历:"+y+"年"+m+"月"); text.setText(""); } /** * 设置showMessage标签的字体颜色为蓝色 */ showMessage.setForeground(Color.BLUE); } /** * ---------重写itemStateChanged方法-------- * 下拉列表的响应事件具体已经在actionPerformed方法内实现 */ public void itemStateChanged(ItemEvent arg0) { // TODO Auto-generated method stub } }
CalendarBean.java
package Calendar; import java.util.Calendar; /** * 生成日历字符串数组 * @author Administrator * @version 版本1.0 */ public class CalendarBean { String day[]; int year=2005,month=0; /** * 设置year的set和get方法 * @param year 年份 * */ public void setYear(int year){ this.year=year; } public int getYear(){ return year; } /** * 设置month的set和get方法 * @param month 月份 */ public void setMonth(int month){ this.month=month; } public int getMonth(){ return month; } /** * 创建可以得到具体日期的字符串数组 * @return 返回具体日期的字符串数组 */ public String[] getCalendar(){ String a[]=new String[42]; Calendar 日历=Calendar.getInstance(); 日历.set(year, month-1, 1); int 星期几=日历.get(Calendar.DAY_OF_WEEK)-1; int day=0; if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) day=31; if(month==4||month==6||month==9||month==11) day=30; if(month==2){ if(((year%4==0)&&(year%100!=0))||(year%400==0)) day=29; else day=28; } for(int i=星期几,n=1;i<星期几+day;i++){ a[i]=String.valueOf(n); n++; } return a; } }