这个随笔是在之前的无界面的calendar的基础上开发的,将输入信息以及显示的内容实现了界面化,让监听线程来实现跳转,利用正则表达式来对输入的年份进行判断。时间问题没有使用流式布局,而是使用了框架不可以放大缩小。请看代码,有可能会有多余的代码,请见谅。如有不足之处请大家明示。
1 import java.awt.Button; 2 import java.awt.Color; 3 import java.awt.GridLayout; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.util.Calendar; 7 import java.util.regex.Matcher; 8 import java.util.regex.Pattern; 9 10 import javax.swing.JFrame; 11 import javax.swing.JLabel; 12 import javax.swing.JOptionPane; 13 import javax.swing.JPanel; 14 import javax.swing.JTextField; 15 @SuppressWarnings("all") 16 public class boudaryCalendar extends JFrame implements ActionListener{ 17 18 19 Button back; 20 Button front; 21 Button Go=new Button("跳转"); 22 JTextField go=new JTextField("请输入年份"); 23 String[] con; 24 JTextField destCalendar; 25 JPanel panel; 26 static int year; 27 static int Maxday; 28 static int month; 29 static int firstday_of_week; 30 static int today; 31 static Calendar calendar; 32 JPanel top; 33 Button[] day_of_week=new Button[7]; 34 JLabel[] day=new JLabel[42]; 35 Button[] tab=new Button[6]; 36 public boudaryCalendar(){ 37 super("日历"); 38 panel=new JPanel(); 39 panel.setBackground(Color.pink); 40 top=new JPanel(); 41 panel.setBounds(10, 50, 370, 400); 42 panel.setLayout(new GridLayout(7,7)); 43 setPanel(); 44 setCompent(); 45 this.setResizable(false); 46 this.add(Go); 47 Go.addActionListener(this); 48 this.add(go); 49 go.addActionListener(this); 50 this.add(destCalendar); 51 destCalendar.addActionListener(this); 52 this.add(back); 53 back.addActionListener(this); 54 this.add(front); 55 front.addActionListener(this); 56 panelAdd(); 57 this.add(panel); 58 this.setVisible(true); 59 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 60 } 61 private void setPanel() { 62 JPanel panel2=new JPanel(); 63 panel2.setBounds(10, 50, 370, 400); 64 panel2.setLayout(new GridLayout(7,7)); 65 String[] str= {"日","一","二","三","四","五","六"}; 66 for(int i=0;i<7;i++) { 67 day_of_week[i]=new Button(str[i]); 68 day_of_week[i].setSize(20, 20); 69 panel.add(day_of_week[i]); 70 71 } 72 for(int i=0;i<42;i++) { //初始化面板 73 day[i]=new JLabel("",JLabel.CENTER); 74 panel.add(day[i]); 75 76 } 77 } 78 public static void main(String[] args){//加载主页 79 calendar=Calendar.getInstance(); 80 today=calendar.get(Calendar.DATE); 81 month=calendar.get(Calendar.MONTH); 82 year=calendar.get(Calendar.YEAR); 83 System.out.println(year); 84 boudaryCalendar dc=new boudaryCalendar(); 85 86 } 87 public void setCompent() {//对组件进行设置 88 this.setLayout(null); 89 Go.setBounds(140, 10, 40, 30); 90 go.setBounds(10, 10, 120, 30); 91 this.setBounds(200, 400, 400, 500); 92 back =new Button("<"); 93 back.setBounds(186, 10, 40, 30); 94 front =new Button(">"); 95 front.setBounds(330, 10, 40, 30); 96 destCalendar=new JTextField(); 97 destCalendar.setBounds(228, 10, 100, 30); 98 destCalendar.setEditable(false); 99 } 100 public static String[] calendar(int month) {//初始化获得本月所有的天数在Label数组中返回 101 String[] everyday=new String[42]; 102 calendar.set(Calendar.MONTH, month); 103 calendar.set(Calendar.DAY_OF_MONTH, 1); 104 Maxday=calendar.getActualMaximum(Calendar.DATE);//获得本月最大的天数 105 firstday_of_week=calendar.get(Calendar.DAY_OF_WEEK)-1; 106 for(int i=firstday_of_week,n=1;i<Maxday+firstday_of_week;i++) { 107 everyday[i]=String.valueOf(n); 108 n++; 109 } 110 111 return everyday; 112 } 113 public void panelAdd() {//对获得的Label数组进行界面化刷新日历 114 String[] str=calendar(month); 115 for(int i=0;i<42;i++) { 116 day[i].setText(str[i]); 117 if(i==today+firstday_of_week-1) { 118 day[i].setText(day[i].getText()+"*"); 119 } 120 } 121 destCalendar.setText(year+"年"+(month+1)+"月"+today); 122 } 123 124 public void buttonBack() {//后退一个月 125 panelAdd(); 126 } 127 public void buttonFront() {//前进一个月 128 panelAdd(); 129 130 } 131 @Override 132 public void actionPerformed(ActionEvent e) { 133 // 判断数据源是哪一个事件相应 134 if(e.getSource()==back) { 135 month--; 136 if(month<0) { 137 year--; 138 calendar.set(Calendar.YEAR, year); 139 month=11; 140 141 } 142 143 buttonBack(); 144 } 145 if(e.getSource()==front) { 146 month++; 147 if(month>11) { 148 year++; 149 calendar.set(Calendar.YEAR,year); 150 month=0; 151 } 152 buttonFront(); 153 } 154 if(e.getSource()==Go){ 155 gotoyear(); 156 } 157 158 } 159 private void gotoyear() {//利用正则表达式对输入的年份进行判断,输入不正确弹出警告框 160 Pattern p=Pattern.compile("[1-9]\\d{1,3}"); 161 String text=go.getText(); 162 Matcher m=p.matcher(text); 163 if(m.matches()){ 164 int dest=Integer.parseInt(go.getText()); 165 year=dest; 166 calendar.set(Calendar.YEAR,year); 167 panelAdd(); 168 } 169 else{ 170 JOptionPane.showMessageDialog(null, "无法解析输入的年份,请检查输入格式", "Error", JOptionPane.ERROR_MESSAGE); 171 } 172 173 } 174 175 }