zxl
21 小时以前 3b0516a2959e25576e4f3fda697a3b025d06c8c9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
package com.ycl.api.YS.util;
 
 
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
public class DateChooser extends JPanel
{
 
    private   int  width  =   200 ;  // 日期控件的宽度
    private   int  height  =   220 ;  // 日期控件的高度
 
    private  GridBagLayout gridBagLayout1  =   new  GridBagLayout();
    public  JTextField jTextFieldDate  =   new  JTextField();
    private  DateChooserButton btnChoose  =   new  DateChooserButton( " ▼ " );  // ▼是指:▼下拉箭头的unicode码
    private  String parten;
    private  Container owner;
    private   int  length = 140 ;
 
 
    /**
     * @wbp.parser.constructor
     */
    public  DateChooser(Container owner, int  length) {
       this .owner  =  owner;
       this .parten  =   " yyyy-MM-dd HH:mm:ss " ;
       this .length = length;
       try  {
          init();
      }
       catch  (Exception ex) {
          ex.printStackTrace();
      }
  }
    /* *
    * 根据一个所有者和一个日期的显示格式构造一个DateChooser对象。
     */
    public  DateChooser(Container owner, String partten, int  length) {
        this .owner  =  owner;
        this .parten  =  partten;
        this .length = length;
        try  {
           init();
       }
        catch  (Exception ex) {
           ex.printStackTrace();
       }
   }
    /* *
    * 根据一个所有者和一个日期的显示格式构造一个DateChooser对象。
     */
    public  DateChooser(Container owner, String partten) {
        this .owner  =  owner;
        this .parten  =  partten;
        try  {
           init();
       }
        catch  (Exception ex) {
           ex.printStackTrace();
       }
 
   }
    /* *
    * 以缺省的partten构建DateChooser对象
    * 日期选择框的所有者必须是Frame或者是JFrame对象。
     */
    public  DateChooser(Container owner) {
        this .owner  =  owner;
        this .parten  =   " yyyy-MM-dd HH:mm:ss" ;
        try  {
           init();
       }
        catch  (Exception ex) {
           ex.printStackTrace();
       }
   }
 
    /* *
    * 系统初始化
    * @throws Exception
     */
    private   void  init() throws Exception {
        jTextFieldDate.setColumns(10);
        jTextFieldDate.setEditable(true);
        jTextFieldDate.setEnabled(true);
        jTextFieldDate.setToolTipText( " 单击右边的按钮即可选择日期 " );
       btnChoose.setToolTipText( " 单击即可选择日期 " );
        this .setLayout(gridBagLayout1);
//       dateField.setEditable( false );
       btnChoose.addActionListener( new  ActionListener() {
            public   void  actionPerformed(ActionEvent e) {
               DateChooser. this .btnChoose_actionPerformed(e);
           }
       });
       Date date  =   new  Date();
       SimpleDateFormat simpleDateFormat  =   new  SimpleDateFormat(parten);
        this .setText(simpleDateFormat.format(date));
        this .add(jTextFieldDate,  new  GridBagConstraints( 0 ,  0 ,  1 ,  1 ,  20.0 ,  0.0
           , GridBagConstraints.CENTER,
           GridBagConstraints.NONE,
            new  Insets( 0 ,  0 ,  0 ,  0 ),  60,  0 ));
        this .add(btnChoose,  new  GridBagConstraints( 1 ,  0 ,  1 ,  1 ,  0.0 ,  0.0
           , GridBagConstraints.CENTER, GridBagConstraints.NONE,
            new  Insets( 0 ,  0 ,  0 ,  0 ),  0 ,  0 ));
   }
    public   void  setToolTipText(String text) {
        jTextFieldDate.setToolTipText(text);
        jTextFieldDate.setToolTipText(text);
   }
    /* *
    * 下拉按钮的事件处理
    * @param e ActionEvent
     */
    public   void  btnChoose_actionPerformed(ActionEvent e) {
       Rectangle r  =  jTextFieldDate.getBounds();
       Point pOnScreen  =  jTextFieldDate.getLocationOnScreen();
 
       Point result  =   new  Point(pOnScreen.x, pOnScreen.y+20 );
//       Point powner  =  owner.getLocation();
//        int  offsetX  =  (pOnScreen.x  +  width)  -  (powner.x  +  owner.getWidth());
//        int  offsetY  =  (pOnScreen.y  +  r.height  +  height)  -
//           (powner.y  +  owner.getHeight());
//
//        if  (offsetX  >   0 ) {
//           result.x  -=  offsetX;
//       }
//
//        if  (offsetY  >   0 ) {
//           result.y  -=  height  +  r.height;
//       }
 
       JDialog dateFrame  =   new  JDialog();
       dateFrame.setModal( false );
       dateFrame.setUndecorated( true );
       dateFrame.setLocation(result);
       dateFrame.setSize(width, height);
 
       dateFrame.addWindowListener( new  WindowAdapter() {
            // 在任意的非日期选择区单击,则日期选择组件将变为非活动状态,自动释放资源。
            public   void  windowDeactivated(WindowEvent e) {
               JDialog f  =  (JDialog) e.getSource();
               f.dispose();
           }
       });
       DatePanel datePanel  =   new  DatePanel(dateFrame, parten);
       dateFrame.getContentPane().setLayout( new  BorderLayout());
       dateFrame.getContentPane().add(datePanel);
       dateFrame.setVisible( true );
   }
    /* *
    * 得到日期控件中的值
    * @return String
     */
    public  String getText() {
        return   this .jTextFieldDate.getText();
   }
    /* *
    * 设置文本域的值
    * @param text String
     */
    public   void  setText(String text) {
        this .jTextFieldDate.setText(text);
   }
    /* *
    * 该方法非常有用,是外部直接访问的TextField对象。
    * @return JTextField
     */
    public  JTextField getDateField() {
        return  jTextFieldDate;
   }
    /* *
    * 内部类,日期选择控件的主体,封装了所有日期选择的内容,主要是一个Panel
     */
    class  DatePanel
       extends JPanel implements MouseListener,
       ChangeListener {
 
        int  startYear  =   1970 ;  // 默认【最小】显示年份
        int  lastYear  =   2050 ;  // 默认【最大】显示年份
 
       Color backGroundColor  =  Color.gray;  // 底色
// 月历表格配色---------------- //
       Color palletTableColor  =  Color.white;  // 日历表底色
       Color weekFontColor  =  Color.blue;  // 星期文字色
       Color dateFontColor  =  Color.black;  // 日期文字色
       Color weekendFontColor  =  Color.red;  // 周末文字色
       Color moveButtonColor  =  Color.GREEN;  // 鼠标移动的日历底色
       Color todayBtnColor  =  Color.pink;  // 今天的日历底色
// 控制条配色------------------ //
       Color controlLineColor  =  Color.pink;  // 控制条底色
       Color controlTextColor  =  Color.white;  // 控制条标签文字色
 
       JSpinner yearSpin;
       JSpinner monthSpin;
       JSpinner hourSpin;
       JButton[][] daysButton  =   new  JButton[ 6 ][ 7 ];
 
       JDialog f;
 
       JPanel dayPanel  =   new  JPanel();  // 日期panel
       JPanel yearPanel  =   new  JPanel();
 
       Calendar calendar  =  Calendar.getInstance();
       String pattern;
 
        /* *
        * 日期选择控件放在了非模态对话框中
         */
        public  DatePanel(JDialog target, String pattern) {
           super();
 
            this .f  =  target;
            this .pattern  =  pattern;
 
           setLayout( new  BorderLayout());
           setBorder( new  LineBorder(backGroundColor,  2 ));
           setBackground(backGroundColor);
           initButton();  // 初始化放置日期的按钮。
           createYearAndMonthPanal();  //
            this .flushWeekAndDayPanal(calendar);  // 之前必须先保证放置日期的按钮已经初始化。
            this .setLayout( new  BorderLayout());
            this .add(yearPanel, BorderLayout.NORTH);
            this .add(dayPanel, BorderLayout.CENTER);
       }
 
        /* *
        * 日期选择控件的按钮初始化
         */
        private   void  initButton() {
            int  actionCommandId  =   1 ;
            for  ( int  i  =   0 ; i  <   6 ; i ++ ) {
                for  ( int  j  =   0 ; j  <   7 ; j ++ ) {
                   JButton numberButton  =   new  JButton();
                   numberButton.setBorder(BorderFactory.createEmptyBorder());
                   numberButton.setHorizontalAlignment(SwingConstants.CENTER);
                   numberButton.setActionCommand(String.valueOf(
                       actionCommandId));
 
                   numberButton.addMouseListener( this );
 
                   numberButton.setBackground(palletTableColor);
                   numberButton.setForeground(dateFontColor);
                   numberButton.setText(String.valueOf(actionCommandId));
                   numberButton.setPreferredSize( new  Dimension( 25 ,  25 ));
                   daysButton[i][j]  =  numberButton;
                   actionCommandId ++ ;
               }
           }
       }
        private  Date getNowDate() {
            return  Calendar.getInstance().getTime();
       }
        private  Calendar getNowCalendar() {
           Calendar result  =  Calendar.getInstance();
            return  result;
       }
        private  Date getSelectDate() {
            return  calendar.getTime();
       }
 
        /* *
        * 创建年月日的面板
         */
        private   void  createYearAndMonthPanal() {
           Calendar c  =  getNowCalendar();
            int  currentYear  =  c. get (Calendar.YEAR);
            int  currentMonth  =  c. get (Calendar.MONTH)  +   1 ;
            int  currentHour  =  c. get (Calendar.DAY_OF_MONTH);
           yearSpin  =   new  JSpinner( new  SpinnerNumberModel(
               currentYear,
               startYear, lastYear,  1 ));
           monthSpin  =   new  JSpinner( new  SpinnerNumberModel(
               currentMonth,  1 ,  12 ,
                1 ));
//           hourSpin  =   new  JSpinner( new  javax.swing.SpinnerNumberModel(
//               currentHour,  0 ,  23 ,
//                1 ));
 
           yearPanel.setLayout( new  FlowLayout());
           yearPanel.setBackground(controlLineColor);
 
           yearSpin.setPreferredSize( new  Dimension( 48 ,  20 ));
           yearSpin.setName( " Year " );
           yearSpin.setEditor( new  JSpinner.NumberEditor(yearSpin,  " #### " ));
           yearSpin.addChangeListener( this );
           yearPanel.add(yearSpin);
 
           JLabel yearLabel  =   new  JLabel( " 年 " );
           yearLabel.setForeground(controlTextColor);
           yearPanel.add(yearLabel);
 
           monthSpin.setPreferredSize( new  Dimension( 35 ,  20 ));
           monthSpin.setName( " Month " );
           monthSpin.addChangeListener( this );
           yearPanel.add(monthSpin);
 
           JLabel monthLabel  =   new  JLabel( " 月 " );
           monthLabel.setForeground(controlTextColor);
           yearPanel.add(monthLabel);
 
       }
        /* *
        * 根据日期刷新显示面板
         */
        private   void  flushWeekAndDayPanal(Calendar c) {
//             c.set
           c. set (Calendar.DAY_OF_MONTH,  1 );
           c.setFirstDayOfWeek( 0 );
            int  firstdayofWeek  =  c. get (Calendar.DAY_OF_WEEK);
            int  lastdayofWeek  =  c.getActualMaximum(Calendar.DAY_OF_MONTH);
           String colname[]  =  {
                " 日 " ,  " 一 " ,  " 二 " ,  " 三 " ,  " 四 " ,  " 五 " ,  " 六 " };
            int  today  =  getNowCalendar(). get (Calendar.DAY_OF_MONTH);
            // 设置固定字体,以免调用环境改变影响界面美观
           dayPanel.setFont( new  Font( " 宋体 " , Font.PLAIN,  12 ));
           dayPanel.setLayout( new  GridBagLayout());
           dayPanel.setBackground(Color.white);
 
           JLabel cell;
 
            for  ( int  i  =   0 ; i  <   7 ; i ++ ) {
               cell  =   new  JLabel(colname[i]);
               cell.setHorizontalAlignment(JLabel.CENTER);
               cell.setPreferredSize( new  Dimension( 25 ,  25 ));
                if  (i  ==   0   ||  i  ==   6 ) {
                   cell.setForeground(weekendFontColor);
               }
                else  {
                   cell.setForeground(weekFontColor);
               }
               dayPanel.add(cell,  new  GridBagConstraints(i,  0 ,  1 ,  1 ,  0.0 ,  0.0
                   , GridBagConstraints.CENTER,
                   GridBagConstraints.NONE,
                    new  Insets( 0 ,  0 ,  0 ,  0 ),  0 ,  0 )
                   );
           }
 
            int  actionCommandId  =   1 ;
            for  ( int  i  =   0 ; i  <   6 ; i ++ ) {
                for  ( int  j  =   0 ; j  <   7 ; j ++ ) {
 
                   JButton numberButton  =  daysButton[i][j];
                   actionCommandId  =  Integer.parseInt(numberButton.
                       getActionCommand());
                    if  (actionCommandId  ==  today) {
                       numberButton.setBackground(todayBtnColor);
                   }
                    if  ( (actionCommandId  +  firstdayofWeek  -   2 )  %   7   ==   6   ||
                       (actionCommandId  +  firstdayofWeek  -   2 )  %   7   ==   0 ) {
                       numberButton.setForeground(weekendFontColor);
                   }
                    else  {
                       numberButton.setForeground(dateFontColor);
                   }
 
                    if  (actionCommandId  <=  lastdayofWeek) {
                        int  y  =   0 ;
                        if  ( (firstdayofWeek  -   1 )  <=
                           (j  +  firstdayofWeek  -   1 )  %   7 ) {
                           y  =  i  +   1 ;
                       }
                        else  {
                           y  =  i  +   2 ;
                       }
                       dayPanel.add(numberButton,
                                     new  GridBagConstraints( (j  +
                           firstdayofWeek  -
                            1 )  %
                            7 , y,  1 ,  1 ,  0.0 ,  0.0
                           , GridBagConstraints.CENTER,
                           GridBagConstraints.NONE,
                            new  Insets( 0 ,  0 ,  0 ,  0 ),  0 ,  0 )
                           );
                   }
               }
           }
       }
 
        private   int  getSelectedYear() {
            return  ( (Integer) yearSpin.getValue()).intValue();
       }
 
        private   int  getSelectedMonth() {
            return  ( (Integer) monthSpin.getValue()).intValue();
       }
 
 
 
        /* *
        * 年月小时的事件处理
        * @param e ChangeEvent
         */
        public   void  stateChanged(ChangeEvent e) {
           JSpinner source  =  (JSpinner) e.getSource();
            if  (source.getName().equals( " Year " )) {
 
               calendar. set (Calendar.YEAR, getSelectedYear());
               dayPanel.removeAll();
                this .flushWeekAndDayPanal(calendar);
               dayPanel.revalidate();
               dayPanel.updateUI();
                return ;
           }
            if  (source.getName().equals( " Month " )) {
               calendar. set (Calendar.MONTH, getSelectedMonth()  -   1 );
 
               dayPanel.removeAll();
                this .flushWeekAndDayPanal(calendar);
               dayPanel.revalidate();
               dayPanel.updateUI();
                return ;
           }
       }
 
        /* *
        * 日期按钮的鼠标事件处理
         */
        public   void  mouseClicked(MouseEvent e) {
            jTextFieldDate.setColumns(10);
            jTextFieldDate.setEnabled(true);
            jTextFieldDate.setEditable(true);
            if  (e.getButton()  ==  MouseEvent.BUTTON1  &&  e.getClickCount()  ==   1 ) {
               JButton source  =  (JButton) e.getSource();
 
               String value  =  source.getText();
                int  day  =  Integer.parseInt(value);
               calendar. set (Calendar.DAY_OF_MONTH, day);
               Date selectDate  =   this .getSelectDate();
               SimpleDateFormat simpleDateFormat  =   new  SimpleDateFormat(
                   pattern);
               DateChooser. this .setText(simpleDateFormat.format(selectDate));
 
                int  year  =  calendar. get (Calendar.YEAR);
                int  month  =  calendar. get (Calendar.MONTH)  +   1 ;
//         System.out.println(year + "年" + month + "月" + day + "日");
               f.dispose();
           }
       }
 
        public   void  mousePressed(MouseEvent e) {
            // 空实现接口中的方法,不能删除
       }
 
        public   void  mouseReleased(MouseEvent e) {
            // 空实现接口中的方法,不能删除
       }
 
        /* *
        * 鼠标移动到日历中的事件
        * @param e MouseEvent
         */
        public   void  mouseEntered(MouseEvent e) {
           JButton jbutton  =  (JButton) e.getSource();
           jbutton.setBackground(moveButtonColor);
 
       }
 
        /* *
        * 鼠标移出日历中的事件
        * @param e MouseEvent
         */
        public   void  mouseExited(MouseEvent e) {
           JButton jbutton  =  (JButton) e.getSource();
            int  comm  =  Integer.parseInt(jbutton.getActionCommand());
            int  today  =  getNowCalendar(). get (Calendar.DAY_OF_MONTH);
            if  (comm  ==  today) {
               jbutton.setBackground(todayBtnColor);
           }
            else  {
               jbutton.setBackground(palletTableColor);
           }
       }
   }
 
    /* *
    * 内部类,改变按钮的边框不可编辑区,使外观更加协调。
     */
    class  DateChooserButton
       extends JButton {
        public  DateChooserButton(String text) {
           super(text);
       }
        public  Insets getInsets() {
            return   new  Insets( 4 , 2 , 0 , 2 );
       }
 
 
   }
}