swing 选择日期控件
此类是一个swing选择日期控件。
效果如下图:
1
//
日期按钮类
2 @SuppressWarnings( " serial " )
3 public class DateChooserJButton extends JButton {
4
5 private DateChooser dateChooser;
6
7 private JTextComponent com;
8
9 private String preLabel = "" ;
10
11 public void setJTextComponent(JTextComponent com) {
12 this .com = com;
13 }
14
15 public DateChooserJButton() {
16 this ( null , getNowDate(), null );
17 }
18
19 public DateChooserJButton(String text) {
20 this (text, getNowDate(), null );
21 }
22
23 public DateChooserJButton(Icon icon) {
24 this ( null , getNowDate(), icon);
25 }
26
27 public DateChooserJButton(Date date) {
28 this ( null , date, null );
29 }
30
31 public DateChooserJButton(String text, Date date, Icon icon) {
32 if (text != null )
33 super .setText(text);
34 if (icon != null )
35 super .setIcon(icon);
36 setBorder( null );
37 setCursor( new Cursor(Cursor.HAND_CURSOR));
38 super .addActionListener( new ActionListener() {
39 public void actionPerformed(ActionEvent e) {
40 if (dateChooser == null )
41 dateChooser = new DateChooser();
42 Point p = getLocationOnScreen();
43 p.y = p.y + 30 ;
44 dateChooser.showDateChooser(p);
45 }
46 } );
47 }
48
49 public DateChooserJButton(SimpleDateFormat df, String dateString) {
50 this ();
51 setText(df, dateString);
52 }
53
54 private static Date getNowDate() {
55 return Calendar.getInstance().getTime();
56 }
57
58 private static SimpleDateFormat getDefaultDateFormat() {
59 return new SimpleDateFormat( " yyyy-MM-dd " );
60 }
61
62 public void setText(SimpleDateFormat df, String s) {
63 Date date;
64 try {
65 date = df.parse(s);
66 } catch (ParseException e) {
67 date = getNowDate();
68 }
69 setDate(date);
70 }
71
72 public void setDate(Date date) {
73 com.setText(getDefaultDateFormat().format(date));
74 }
75
76 public Date getDate() {
77 String dateString = getText().substring(preLabel.length());
78 try {
79 return getDefaultDateFormat().parse(dateString);
80 } catch (ParseException e) {
81 return getNowDate();
82 }
83 }
84
85 // 覆盖父类的方法使之无效
86 public void addActionListener(ActionListener listener) {
87 }
88
89 private class DateChooser extends JPanel implements ActionListener,
90 ChangeListener {
91 int startYear = 1980 ; // 默认【最小】显示年份
92
93 int lastYear = 2050 ; // 默认【最大】显示年份
94
95 int width = 200 ; // 界面宽度
96
97 int height = 200 ; // 界面高度
98
99 Color backGroundColor = Color.gray; // 底色
100
101 // 月历表格配色---------------- //
102
103 Color palletTableColor = Color.white; // 日历表底色
104
105 Color todayBackColor = Color.orange; // 今天背景色
106
107 Color weekFontColor = Color.blue; // 星期文字色
108
109 Color dateFontColor = Color.black; // 日期文字色
110
111 Color weekendFontColor = Color.red; // 周末文字色
112
113 // 控制条配色------------------ //
114 Color controlLineColor = Color.pink; // 控制条底色
115
116 Color controlTextColor = Color.white; // 控制条标签文字色
117
118 Color rbFontColor = Color.white; // RoundBox文字色
119
120 Color rbBorderColor = Color.red; // RoundBox边框色
121
122 Color rbButtonColor = Color.pink; // RoundBox按钮色
123
124 Color rbBtFontColor = Color.red; // RoundBox按钮文字色
125
126 JDialog dialog;
127
128 JSpinner yearSpin;
129
130 JSpinner monthSpin;
131
132 JSpinner hourSpin;
133
134 JButton[][] daysButton = new JButton[ 6 ][ 7 ];
135
136 DateChooser() {
137
138 setLayout( new BorderLayout());
139 setBorder( new LineBorder(backGroundColor, 2 ));
140 setBackground(backGroundColor);
141
142 JPanel topYearAndMonth = createYearAndMonthPanal();
143 add(topYearAndMonth, BorderLayout.NORTH);
144 JPanel centerWeekAndDay = createWeekAndDayPanal();
145 add(centerWeekAndDay, BorderLayout.CENTER);
146
147 }
148
149 private JPanel createYearAndMonthPanal() {
150 Calendar c = getCalendar();
151 int currentYear = c.get(Calendar.YEAR);
152 int currentMonth = c.get(Calendar.MONTH) + 1 ;
153 int currentHour = c.get(Calendar.HOUR_OF_DAY);
154
155 JPanel result = new JPanel();
156 result.setLayout( new FlowLayout());
157 result.setBackground(controlLineColor);
158
159 yearSpin = new JSpinner( new SpinnerNumberModel(currentYear,
160 startYear, lastYear, 1 ));
161 yearSpin.setPreferredSize( new Dimension( 48 , 20 ));
162 yearSpin.setName( " Year " );
163 yearSpin.setEditor( new JSpinner.NumberEditor(yearSpin, " #### " ));
164 yearSpin.addChangeListener( this );
165 result.add(yearSpin);
166
167 JLabel yearLabel = new JLabel( " 年 " );
168 yearLabel.setForeground(controlTextColor);
169 result.add(yearLabel);
170
171 monthSpin = new JSpinner( new SpinnerNumberModel(currentMonth, 1 ,
172 12 , 1 ));
173 monthSpin.setPreferredSize( new Dimension( 35 , 20 ));
174 monthSpin.setName( " Month " );
175 monthSpin.addChangeListener( this );
176 result.add(monthSpin);
177
178 JLabel monthLabel = new JLabel( " 月 " );
179 monthLabel.setForeground(controlTextColor);
180 result.add(monthLabel);
181
182 hourSpin = new JSpinner( new SpinnerNumberModel(currentHour, 0 , 23 ,
183 1 ));
184 hourSpin.setPreferredSize( new Dimension( 35 , 20 ));
185 hourSpin.setName( " Hour " );
186 hourSpin.addChangeListener( this );
187 result.add(hourSpin);
188
189 JLabel hourLabel = new JLabel( " 时 " );
190 hourLabel.setForeground(controlTextColor);
191 result.add(hourLabel);
192
193 return result;
194 }
195
196 private JPanel createWeekAndDayPanal() {
197 String colname[] = { " 日 " , " 一 " , " 二 " , " 三 " , " 四 " , " 五 " , " 六 " } ;
198 JPanel result = new JPanel();
199 // 设置固定字体,以免调用环境改变影响界面美观
200 result.setFont( new Font( " 宋体 " , Font.PLAIN, 12 ));
201 result.setLayout( new GridLayout( 7 , 7 ));
202 result.setBackground(Color.white);
203 JLabel cell;
204
205 for ( int i = 0 ; i < 7 ; i ++ ) {
206 cell = new JLabel(colname[i]);
207 cell.setHorizontalAlignment(JLabel.RIGHT);
208 if (i == 0 || i == 6 )
209 cell.setForeground(weekendFontColor);
210 else
211 cell.setForeground(weekFontColor);
212 result.add(cell);
213 }
214
215 int actionCommandId = 0 ;
216 for ( int i = 0 ; i < 6 ; i ++ )
217 for ( int j = 0 ; j < 7 ; j ++ ) {
218 JButton numberButton = new JButton();
219 numberButton.setBorder( null );
220 numberButton.setHorizontalAlignment(SwingConstants.RIGHT);
221 numberButton.setActionCommand(String
222 .valueOf(actionCommandId));
223 numberButton.addActionListener( this );
224 numberButton.setBackground(palletTableColor);
225 numberButton.setForeground(dateFontColor);
226 if (j == 0 || j == 6 )
227 numberButton.setForeground(weekendFontColor);
228 else
229 numberButton.setForeground(dateFontColor);
230 daysButton[i][j] = numberButton;
231 result.add(numberButton);
232 actionCommandId ++ ;
233 }
234
235 return result;
236 }
237
238 private JDialog createDialog(Frame owner) {
239 JDialog result = new JDialog(owner, " 日期时间选择 " , true );
240 result.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
241 result.getContentPane().add( this , BorderLayout.CENTER);
242 result.pack();
243 result.setSize(width, height);
244 return result;
245 }
246
247 @SuppressWarnings( " deprecation " )
248 void showDateChooser(Point position) {
249 Frame owner = (Frame) SwingUtilities
250 .getWindowAncestor(DateChooserJButton. this );
251 if (dialog == null || dialog.getOwner() != owner)
252 dialog = createDialog(owner);
253 dialog.setLocation(getAppropriateLocation(owner, position));
254 flushWeekAndDay();
255 dialog.show();
256 }
257
258 Point getAppropriateLocation(Frame owner, Point position) {
259 Point result = new Point(position);
260 Point p = owner.getLocation();
261 int offsetX = (position.x + width) - (p.x%
2 @SuppressWarnings( " serial " )
3 public class DateChooserJButton extends JButton {
4
5 private DateChooser dateChooser;
6
7 private JTextComponent com;
8
9 private String preLabel = "" ;
10
11 public void setJTextComponent(JTextComponent com) {
12 this .com = com;
13 }
14
15 public DateChooserJButton() {
16 this ( null , getNowDate(), null );
17 }
18
19 public DateChooserJButton(String text) {
20 this (text, getNowDate(), null );
21 }
22
23 public DateChooserJButton(Icon icon) {
24 this ( null , getNowDate(), icon);
25 }
26
27 public DateChooserJButton(Date date) {
28 this ( null , date, null );
29 }
30
31 public DateChooserJButton(String text, Date date, Icon icon) {
32 if (text != null )
33 super .setText(text);
34 if (icon != null )
35 super .setIcon(icon);
36 setBorder( null );
37 setCursor( new Cursor(Cursor.HAND_CURSOR));
38 super .addActionListener( new ActionListener() {
39 public void actionPerformed(ActionEvent e) {
40 if (dateChooser == null )
41 dateChooser = new DateChooser();
42 Point p = getLocationOnScreen();
43 p.y = p.y + 30 ;
44 dateChooser.showDateChooser(p);
45 }
46 } );
47 }
48
49 public DateChooserJButton(SimpleDateFormat df, String dateString) {
50 this ();
51 setText(df, dateString);
52 }
53
54 private static Date getNowDate() {
55 return Calendar.getInstance().getTime();
56 }
57
58 private static SimpleDateFormat getDefaultDateFormat() {
59 return new SimpleDateFormat( " yyyy-MM-dd " );
60 }
61
62 public void setText(SimpleDateFormat df, String s) {
63 Date date;
64 try {
65 date = df.parse(s);
66 } catch (ParseException e) {
67 date = getNowDate();
68 }
69 setDate(date);
70 }
71
72 public void setDate(Date date) {
73 com.setText(getDefaultDateFormat().format(date));
74 }
75
76 public Date getDate() {
77 String dateString = getText().substring(preLabel.length());
78 try {
79 return getDefaultDateFormat().parse(dateString);
80 } catch (ParseException e) {
81 return getNowDate();
82 }
83 }
84
85 // 覆盖父类的方法使之无效
86 public void addActionListener(ActionListener listener) {
87 }
88
89 private class DateChooser extends JPanel implements ActionListener,
90 ChangeListener {
91 int startYear = 1980 ; // 默认【最小】显示年份
92
93 int lastYear = 2050 ; // 默认【最大】显示年份
94
95 int width = 200 ; // 界面宽度
96
97 int height = 200 ; // 界面高度
98
99 Color backGroundColor = Color.gray; // 底色
100
101 // 月历表格配色---------------- //
102
103 Color palletTableColor = Color.white; // 日历表底色
104
105 Color todayBackColor = Color.orange; // 今天背景色
106
107 Color weekFontColor = Color.blue; // 星期文字色
108
109 Color dateFontColor = Color.black; // 日期文字色
110
111 Color weekendFontColor = Color.red; // 周末文字色
112
113 // 控制条配色------------------ //
114 Color controlLineColor = Color.pink; // 控制条底色
115
116 Color controlTextColor = Color.white; // 控制条标签文字色
117
118 Color rbFontColor = Color.white; // RoundBox文字色
119
120 Color rbBorderColor = Color.red; // RoundBox边框色
121
122 Color rbButtonColor = Color.pink; // RoundBox按钮色
123
124 Color rbBtFontColor = Color.red; // RoundBox按钮文字色
125
126 JDialog dialog;
127
128 JSpinner yearSpin;
129
130 JSpinner monthSpin;
131
132 JSpinner hourSpin;
133
134 JButton[][] daysButton = new JButton[ 6 ][ 7 ];
135
136 DateChooser() {
137
138 setLayout( new BorderLayout());
139 setBorder( new LineBorder(backGroundColor, 2 ));
140 setBackground(backGroundColor);
141
142 JPanel topYearAndMonth = createYearAndMonthPanal();
143 add(topYearAndMonth, BorderLayout.NORTH);
144 JPanel centerWeekAndDay = createWeekAndDayPanal();
145 add(centerWeekAndDay, BorderLayout.CENTER);
146
147 }
148
149 private JPanel createYearAndMonthPanal() {
150 Calendar c = getCalendar();
151 int currentYear = c.get(Calendar.YEAR);
152 int currentMonth = c.get(Calendar.MONTH) + 1 ;
153 int currentHour = c.get(Calendar.HOUR_OF_DAY);
154
155 JPanel result = new JPanel();
156 result.setLayout( new FlowLayout());
157 result.setBackground(controlLineColor);
158
159 yearSpin = new JSpinner( new SpinnerNumberModel(currentYear,
160 startYear, lastYear, 1 ));
161 yearSpin.setPreferredSize( new Dimension( 48 , 20 ));
162 yearSpin.setName( " Year " );
163 yearSpin.setEditor( new JSpinner.NumberEditor(yearSpin, " #### " ));
164 yearSpin.addChangeListener( this );
165 result.add(yearSpin);
166
167 JLabel yearLabel = new JLabel( " 年 " );
168 yearLabel.setForeground(controlTextColor);
169 result.add(yearLabel);
170
171 monthSpin = new JSpinner( new SpinnerNumberModel(currentMonth, 1 ,
172 12 , 1 ));
173 monthSpin.setPreferredSize( new Dimension( 35 , 20 ));
174 monthSpin.setName( " Month " );
175 monthSpin.addChangeListener( this );
176 result.add(monthSpin);
177
178 JLabel monthLabel = new JLabel( " 月 " );
179 monthLabel.setForeground(controlTextColor);
180 result.add(monthLabel);
181
182 hourSpin = new JSpinner( new SpinnerNumberModel(currentHour, 0 , 23 ,
183 1 ));
184 hourSpin.setPreferredSize( new Dimension( 35 , 20 ));
185 hourSpin.setName( " Hour " );
186 hourSpin.addChangeListener( this );
187 result.add(hourSpin);
188
189 JLabel hourLabel = new JLabel( " 时 " );
190 hourLabel.setForeground(controlTextColor);
191 result.add(hourLabel);
192
193 return result;
194 }
195
196 private JPanel createWeekAndDayPanal() {
197 String colname[] = { " 日 " , " 一 " , " 二 " , " 三 " , " 四 " , " 五 " , " 六 " } ;
198 JPanel result = new JPanel();
199 // 设置固定字体,以免调用环境改变影响界面美观
200 result.setFont( new Font( " 宋体 " , Font.PLAIN, 12 ));
201 result.setLayout( new GridLayout( 7 , 7 ));
202 result.setBackground(Color.white);
203 JLabel cell;
204
205 for ( int i = 0 ; i < 7 ; i ++ ) {
206 cell = new JLabel(colname[i]);
207 cell.setHorizontalAlignment(JLabel.RIGHT);
208 if (i == 0 || i == 6 )
209 cell.setForeground(weekendFontColor);
210 else
211 cell.setForeground(weekFontColor);
212 result.add(cell);
213 }
214
215 int actionCommandId = 0 ;
216 for ( int i = 0 ; i < 6 ; i ++ )
217 for ( int j = 0 ; j < 7 ; j ++ ) {
218 JButton numberButton = new JButton();
219 numberButton.setBorder( null );
220 numberButton.setHorizontalAlignment(SwingConstants.RIGHT);
221 numberButton.setActionCommand(String
222 .valueOf(actionCommandId));
223 numberButton.addActionListener( this );
224 numberButton.setBackground(palletTableColor);
225 numberButton.setForeground(dateFontColor);
226 if (j == 0 || j == 6 )
227 numberButton.setForeground(weekendFontColor);
228 else
229 numberButton.setForeground(dateFontColor);
230 daysButton[i][j] = numberButton;
231 result.add(numberButton);
232 actionCommandId ++ ;
233 }
234
235 return result;
236 }
237
238 private JDialog createDialog(Frame owner) {
239 JDialog result = new JDialog(owner, " 日期时间选择 " , true );
240 result.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
241 result.getContentPane().add( this , BorderLayout.CENTER);
242 result.pack();
243 result.setSize(width, height);
244 return result;
245 }
246
247 @SuppressWarnings( " deprecation " )
248 void showDateChooser(Point position) {
249 Frame owner = (Frame) SwingUtilities
250 .getWindowAncestor(DateChooserJButton. this );
251 if (dialog == null || dialog.getOwner() != owner)
252 dialog = createDialog(owner);
253 dialog.setLocation(getAppropriateLocation(owner, position));
254 flushWeekAndDay();
255 dialog.show();
256 }
257
258 Point getAppropriateLocation(Frame owner, Point position) {
259 Point result = new Point(position);
260 Point p = owner.getLocation();
261 int offsetX = (position.x + width) - (p.x%