MyException - 我的异常网
当前位置:我的异常网» 编程 » 简略的日历控件

简略的日历控件

www.MyException.Cn  网友分享于:2013-10-26  浏览:47次
简单的日历控件
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();
  }
}

文章评论

为什么程序员都是夜猫子
为什么程序员都是夜猫子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Java程序员必看电影
Java程序员必看电影
 程序员的样子
程序员的样子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
如何成为一名黑客
如何成为一名黑客
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员应该关注的一些事儿
程序员应该关注的一些事儿
那些争议最大的编程观点
那些争议最大的编程观点
我是如何打败拖延症的
我是如何打败拖延症的
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
中美印日四国程序员比较
中美印日四国程序员比较
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序员的鄙视链
程序员的鄙视链
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
鲜为人知的编程真相
鲜为人知的编程真相
编程语言是女人
编程语言是女人
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员必看的十大电影
程序员必看的十大电影
10个调试和排错的小建议
10个调试和排错的小建议
旅行,写作,编程
旅行,写作,编程
漫画:程序员的工作
漫画:程序员的工作
老程序员的下场
老程序员的下场
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
总结2014中国互联网十大段子
总结2014中国互联网十大段子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有