java日期控件--4--MyCalendarPanel.java

来源:互联网 发布:rule deny source mac 编辑:程序博客网 时间:2024/05/16 19:21

MyCalendarPanel.java

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Date;
import java.util.StringTokenizer;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.ImageIcon;

 

public class MyCalendarPanel extends JPanel {
    private ImageIcon Icon1 = null;
    private ImageIcon Icon2 = null;
    private ImageIcon Icon3 = null;
    private ImageIcon Icon4 = null;

//得到时间
    public  JTextField outText = new JTextField();
//动态表示年月日
    private int year = 0;
    private int month = 0;
    private int day = 0;
//主面板
    private JPanel Main = new JPanel();
//日面板
    private JPanel jPanelDay = new JPanel();
//月面板
    private JPanel jPanelMonth = new JPanel();
//年的输入位置
    private JTextField Year = new JTextField();
//月的输入位置
    private JTextField Month = new JTextField();
//减少月份
    private JButton MonthDown = new JButton();
//增加月份
    private JButton MonthUp = new JButton();
//返回选种日期
    private JPanel jPanelButton = new JPanel();
//减少年份
    private JButton YearDown = new JButton();
//增加年份
    private JButton YearUp = new JButton();
//显示日期的位置
    public JLabel Out = new JLabel();
//中国时区,以后可以从这里扩展可以设置时区的功能
    private Locale l = Locale.CHINESE;
//主日历
    private GregorianCalendar cal = new GregorianCalendar(l);
//星期面板
    private JPanel weekPanel = new JPanel();
//天按钮组
    private JToggleButton[] days = new JToggleButton[42];
//天面板
    private JPanel Days = new JPanel();
//标示
    private JLabel jLabel1 = new JLabel();
    private JLabel jLabel2 = new JLabel();
    private JLabel jLabel3 = new JLabel();
    private JLabel jLabel4 = new JLabel();
    private JLabel jLabel5 = new JLabel();
    private JLabel jLabel6 = new JLabel();
    private JLabel jLabel7 = new JLabel();
//当前选择的天数按钮
    private JToggleButton cur = null;
//月份天数数组,用来取得当月有多少天
// 1 2 3 4 5 6 7 8 9 10 11 12
    private int[] mm = ...{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

//空日期构造函数
    public MyCalendarPanel() {
        try ...{
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

//带日期设置的构造函数
    public MyCalendarPanel(int year, int month, int day) {
        cal.set(year, month, day);
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//带日历输入的构造函数
    public MyCalendarPanel(GregorianCalendar calendar){
        cal = calendar;
        try{
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//带日期输入的构造函数
    public MyCalendarPanel(Date date) {
        cal.setTime(date);
        try ...{
            jbInit();
        } catch (Exception e) ...{
            e.printStackTrace();
        }
    }

//初始化组件
    private void jbInit() throws Exception ...{
//初始化年、月、日
        iniCalender();

        this.setLayout(new BorderLayout());
        this.setBorder(BorderFactory.createRaisedBevelBorder());
        this.setMaximumSize(new Dimension(200, 200));
        this.setMinimumSize(new Dimension(200, 200));
        this.setPreferredSize(new Dimension(200, 200));

        Main.setLayout(new BorderLayout());
        Main.setBackground(SystemColor.info);
        Main.setBorder(null);

        Out.setBackground(Color.lightGray);
        Out.setHorizontalAlignment(SwingConstants.CENTER);
        Out.setMaximumSize(new Dimension(100, 19));
        Out.setMinimumSize(new Dimension(100, 19));
        Out.setPreferredSize(new Dimension(100, 19));

        jLabel1.setForeground(Color.red);
        jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel1.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel1.setText("日");
        jLabel2.setForeground(Color.blue);
        jLabel2.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel2.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel2.setText("六");
        jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel3.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel3.setText("五");
        jLabel4.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel4.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel4.setText("四");
        jLabel5.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel5.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel5.setText("三");
        jLabel6.setBorder(null);
        jLabel6.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel6.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel6.setText("二");
        jLabel7.setBackground(Color.lightGray);
        jLabel7.setForeground(Color.black);
        jLabel7.setBorder(null);
        jLabel7.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel7.setHorizontalTextPosition(SwingConstants.CENTER);
        jLabel7.setText("一");

        weekPanel.setBackground(UIManager.getColor(
                "InternalFrame.activeTitleGradient"));
        weekPanel.setBorder(BorderFactory.createEtchedBorder());
        weekPanel.setLayout(new GridLayout(1, 7));
        weekPanel.add(jLabel1, null);
        weekPanel.add(jLabel7, null);
        weekPanel.add(jLabel6, null);
        weekPanel.add(jLabel5, null);
        weekPanel.add(jLabel4, null);
        weekPanel.add(jLabel3, null);
        weekPanel.add(jLabel2, null);

        MonthUp.setAlignmentX((float) 0.0);
        MonthUp.setActionMap(null);

        jPanelMonth.setBackground(SystemColor.info);
        jPanelMonth.setLayout(new BorderLayout());
        jPanelMonth.setBorder(BorderFactory.createEtchedBorder());

        Month.setBorder(null);
        Month.setHorizontalAlignment(SwingConstants.CENTER);
        Month.addMouseListener(new java.awt.event.MouseAdapter() ...{
            public void mouseClicked(MouseEvent e) ...{
                Month_mouseClicked(e);
            }
        });
        Month.addKeyListener(new java.awt.event.KeyAdapter() ...{
            public void keyPressed(KeyEvent e) ...{
                Month_keyPressed(e);
            }
        });

        MonthDown.setBorder(null);
        Icon1 = ImageHelper.loadImage("ArrowLeft.gif");
        MonthDown = new NoFocusButton(Icon1);
        MonthDown.addActionListener(new java.awt.event.ActionListener() ...{
            public void actionPerformed(ActionEvent e) ...{
                MonthDown_actionPerformed(e);
            }
        });
        MonthUp.setBorder(null);
        Icon2 = ImageHelper.loadImage("ArrowRight.gif");
        MonthUp = new NoFocusButton(Icon2);
        MonthUp.addActionListener(new java.awt.event.ActionListener() ...{
            public void actionPerformed(ActionEvent e) ...{
                MonthUp_actionPerformed(e);
            }
        });

        jPanelButton.setLayout(null);
        jPanelButton.setBorder(null);
        jPanelButton.addComponentListener(new java.awt.event.ComponentAdapter() ...{
            public void componentResized(java.awt.event.ComponentEvent evt) ...{
                jPanelButtonComponentResized(evt);
            }
        });

        Year.setBorder(BorderFactory.createEtchedBorder());
        Year.setMaximumSize(new Dimension(80, 25));
        Year.setMinimumSize(new Dimension(80, 25));
        Year.setPreferredSize(new Dimension(80, 25));
        Year.setHorizontalAlignment(SwingConstants.CENTER);
        Year.addMouseListener(new java.awt.event.MouseAdapter() ...{
            public void mouseClicked(MouseEvent e) ...{
                Year_mouseClicked(e);
            }
        });
        Year.addKeyListener(new java.awt.event.KeyAdapter() ...{
            public void keyPressed(KeyEvent e) ...{
                Year_keyPressed(e);
            }
        });

        YearDown.setBorder(null);
        YearDown.setMaximumSize(new Dimension(16, 16));
        YearDown.setMinimumSize(new Dimension(16, 16));
        YearDown.setPreferredSize(new Dimension(16, 16));
        YearDown.setSize(new Dimension(16, 16));
        YearDown.setText("D");
        YearDown.setToolTipText("Down");
        YearDown.addActionListener(new java.awt.event.ActionListener() ...{
            public void actionPerformed(ActionEvent e) ...{
                YearDown_actionPerformed(e);
            }
        });
        YearUp.setBorder(null);
        YearUp.setMaximumSize(new Dimension(16, 16));
        YearUp.setMinimumSize(new Dimension(16, 16));
        YearUp.setPreferredSize(new Dimension(16, 16));
        YearUp.setSize(new Dimension(16, 16));
        YearUp.setText("U");
        YearUp.setToolTipText("Up");
        YearUp.addActionListener(new java.awt.event.ActionListener() ...{
            public void actionPerformed(ActionEvent e) ...{
                YearUp_actionPerformed(e);
            }
        });

        jPanelDay.setLayout(new BorderLayout());

        Days.setLayout(new GridLayout(6, 7));
        Days.setBackground(SystemColor.info);

        for (int i = 0; i < 42; i++) ...{
            days[i] = new JToggleButton();
            days[i].setBorder(null);
            days[i].setFocusPainted(false);
            days[i].setBackground(SystemColor.info);
            days[i].setHorizontalAlignment(SwingConstants.CENTER);
            days[i].setHorizontalTextPosition(SwingConstants.CENTER);
            days[i].addActionListener(new java.awt.event.ActionListener() ...{
                public void actionPerformed(ActionEvent e) ...{
                    day = Integer.parseInt(((JToggleButton) e.getSource()).
                                           getText());
                    showDate();
                    showDays();
                }
            });
            days[i].addMouseListener(new java.awt.event.MouseAdapter() ...{
                public void mouseReleased(MouseEvent e) ...{
                outText.setText(Out.getText());
                }
            });
            Days.add(days[i]);
        }

        this.add(Main, BorderLayout.NORTH);
        this.add(jPanelDay, BorderLayout.CENTER);
        this.add(jPanelMonth, BorderLayout.SOUTH);

        Main.add(Year, BorderLayout.CENTER);
        Main.add(Out, BorderLayout.WEST);
        Main.add(jPanelButton, BorderLayout.EAST);

        jPanelButton.add(YearUp);
        jPanelButton.add(YearDown);

        jPanelDay.add(weekPanel, BorderLayout.NORTH);
        jPanelDay.add(Days, BorderLayout.CENTER);

        jPanelMonth.add(Month, BorderLayout.CENTER);
        jPanelMonth.add(MonthDown, BorderLayout.WEST);
        jPanelMonth.add(MonthUp, BorderLayout.EAST);
        showMonth();
        showYear();
        showDate();
        showDays();
    }

//自定义重画年选择面板
    void jPanelButtonComponentResized(java.awt.event.ComponentEvent evt) ...{
        YearUp.setLocation(0, 0);
        YearDown.setLocation(0, YearUp.getHeight());
        jPanelButton.setSize(YearUp.getWidth(), YearUp.getHeight() * 2);
        jPanelButton.setPreferredSize(new Dimension(YearUp.getWidth(),
                YearUp.getHeight() * 2));
        jPanelButton.updateUI();
    }


//增加年份
    void YearUp_actionPerformed(ActionEvent e) ...{
        year++;
        showYear();
        showDate();
        showDays();
    }

//减少年份
    void YearDown_actionPerformed(ActionEvent e) ...{
        year--;
        showYear();
        showDate();
        showDays();
    }

//减少月份
    void MonthDown_actionPerformed(ActionEvent e) ...{
        month--;
        if (month < 0) ...{
            month = 11;
            year--;
            showYear();
        }
        showMonth();
        showDate();
        showDays();
    }

//增加月份
    void MonthUp_actionPerformed(ActionEvent e) ...{
        month++;
        if (month == 12) ...{
            month = 0;
            year++;
            showYear();
        }
        showMonth();
        showDate();
        showDays();
    }

//初始化年月日
    void iniCalender() ...{
        year = cal.get(Calendar.YEAR);
        month = cal.get(Calendar.MONTH);
        day = cal.get(Calendar.DAY_OF_MONTH);
    }

//刷新月份
    void showMonth() ...{
        Month.setText(Integer.toString(month + 1) + "月");
    }

//刷新年份
    void showYear() ...{
        Year.setText(Integer.toString(year) + "年");
    }

//刷新日期
    void showDate() ...{
        Out.setText(Integer.toString(year) + "-" + Integer.toString(month + 1) +
                    "-" + Integer.toString(day));
    }

//重画天数选择面板
    void showDays() ...{
        cal.set(year, month, 1);
        int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        int n = mm[month];
        if (cal.isLeapYear(year) && month == 1) ...{
            n++;
        }
        int i = 0;
        for (; i < firstDayOfWeek - 1; i++) ...{
            days[i].setEnabled(false);
            days[i].setSelected(false);
            days[i].setText("");
        }
        int d = 1;
        for (; d <= n; d++) ...{
            days[i].setText(Integer.toString(d));
            days[i].setEnabled(true);
            if (d == day) ...{
                days[i].setSelected(true);
            } else ...{
                days[i].setSelected(false); ;
            }
            i++;
        }
        for (; i < 42; i++) ...{
            days[i].setEnabled(false);
            days[i].setSelected(false);
            days[i].setText("");
        }
    }

//单击年份面板选择整个年份字符串
    void SelectionYear() ...{
        Year.setSelectionStart(0);
        Year.setSelectionEnd(Year.getText().length());
    }

//单击月份面板选择整个月份字符串
    void SelectionMonth() ...{
        Month.setSelectionStart(0);
        Month.setSelectionEnd(Month.getText().length());
    }

//月份面板响应鼠标单击事件
    void Month_mouseClicked(MouseEvent e) ...{
//SelectionMonth();
        inputMonth();
    }

//检验输入的月份
    void inputMonth() ...{
        String s;
        if (Month.getText().endsWith("月")) ...{
            s = Month.getText().substring(0, Month.getText().length() - 1);
        } else ...{
            s = Month.getText();
        }
        month = Integer.parseInt(s) - 1;
        this.showMe();
    }

//月份面板键盘敲击事件响应
    void Month_keyPressed(KeyEvent e) ...{
        if (e.getKeyChar() == 10) ...{
            inputMonth();
        }
    }

//年份面板响应鼠标单击事件
    void Year_mouseClicked(MouseEvent e) ...{
//SelectionYear();
        inputYear();
    }

//年份键盘敲击事件响应
    void Year_keyPressed(KeyEvent e) ...{
//System.out.print(new Integer(e.getKeyChar()).byteValue());
        if (e.getKeyChar() == 10) ...{
            inputYear();
        }
    }

//检验输入的年份字符串
    void inputYear() ...{
        String s;
        if (Year.getText().endsWith("年")) ...{
            s = Year.getText().substring(0, Year.getText().length() - 1);
        } else ...{
            s = Year.getText();
        }
        year = Integer.parseInt(s);
        this.showMe();
    }

//以字符串形式返回日期,yyyy-mm-dd
    public String getDate() ...{
        return Out.getText();
    }

//以字符串形式输入日期,yyyy-mm-dd
    public void setDate(String date) ...{
        if (date != null) ...{
            StringTokenizer f = new StringTokenizer(date, "-");
            if (f.hasMoreTokens()) ...{
                year = Integer.parseInt(f.nextToken());
            }
            if (f.hasMoreTokens()) ...{
                month = Integer.parseInt(f.nextToken());
            }
            if (f.hasMoreTokens()) ...{
                day = Integer.parseInt(f.nextToken());
            }
            cal.set(year, month, day);
        }
        this.showMe();
    }

//以日期对象形式输入日期
    public void setTime(Date date) ...{
        cal.setTime(date);
        this.iniCalender();
        this.showMe();
    }

//返回日期对象
    public Date getTime() ...{
        return cal.getTime();
    }

//返回当前的日
    public int getDay() ...{
        return day;
    }

//设置当前的日
    public void setDay(int day) ...{
        this.day = day;
        cal.set(this.year, this.month, this.day);
        this.showMe();
  &nb, sp; }

//设置当前的年
    public void setYear(int year) ...{
        this.year = year;
        cal.set(this.year, this.month, this.day);
        this.showMe();
    }

//返回当前的年
    public int getYear() ...{
        return year;
    }

//返回当前的月
    public int getMonth() ...{
        return month;
    }

//设置当前的月
    public void setMonth(int month) ...{
        this.month = month;
        cal.set(this.year, this.month, this.day);
        this.showMe();
    }

//刷新
    public void showMe() ...{
        this.showDays();
        this.showMonth();
        this.showYear();
        this.showDate();
    }
    private class NoFocusButton extends JButton ...{
        public NoFocusButton(ImageIcon icon) ...{
            super(icon);
            setFocusPainted(false);
            setRolloverEnabled(true);
        }

        public boolean isFocusTraversable() ...{
            return false;
        }

        public void requestFocus() ...{}
    }
}

原创粉丝点击