简单的日历控件

package Exception;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
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.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

/**
* <p>Title: Swing日历</p>
* <p>Description: 操作日期</p>
* @author duxu2004
* @version 1.0.1
*/

class JCalendar extends JPanel{
//动态表示年月日
  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();
//显示日期的位置
  private 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 JCalendar() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }

  }
//带日期设置的构造函数
  public JCalendar(int year, int month, int day) {
    cal.set(year, month, day);
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
//带日历输入的构造函数
  public JCalendar(GregorianCalendar calendar) {
    cal=calendar;
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
  //带日期输入的构造函数
  public JCalendar(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);
    MonthDown.setText("\u25C4");
    MonthDown.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        MonthDown_actionPerformed(e);
      }
    });
    MonthUp.setBorder(null);
    MonthUp.setText("\u25BA");
    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("▼");
    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("▲");
    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].setBackground(SystemColor.info);
      days[i].setHorizontalAlignment(SwingConstants.CENTER);
      days[i].setHorizontalTextPosition(SwingConstants.CENTER);
      //days[i].setSize(l,l);
      days[i].addActionListener(new java.awt.event.ActionListener(){
        public void actionPerformed(ActionEvent e) {
          day=Integer.parseInt(((JToggleButton)e.getSource()).getText());
          showDate();
          showDays();
        }
      });
      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();
  }
 
  //测试用
  public static void main(String[] args){
    JFrame f=new JFrame();
    f.setContentPane(new JCalendar());
    f.pack();
    //f.setResizable(false);
    f.show();
  }

  //增加年份
  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();
  }
 
  //设置当前的年
  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();
  }

}


public class TestJCalendor {
  public static void main(String[] args) {
    JFrame f=new JFrame();
    f.setContentPane(new JCalendar());
    f.pack();
    //f.setResizable(false);
    f.show();
  }
}

你可能感兴趣的:(java,swing,F#)