`

简单的日历控件

阅读更多
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();
  }
}
分享到:
评论

相关推荐

    Eson-用于WEB的简单日历控件 v1.1

    Eson简单日历控件是用于web的简单日历控件。(请在web环境中测试使用)* 不依赖于任何前端框架。* 支持单选,多选。* 自定义控件数量。* 自定义星期显示。* 自定义工作日的第一天。* 自定义日期格式。* 表单自动绑定...

    简单日历控件

    一个简单实用的日历控件

    简单好看的js日历控件

    简单好看的js日历控件

    最简单的日历控件

    最简单的日历控件,使用的是xml布局,有开始时间和结束时间,只有开始时间和结束时间的item能点击,每个item上边显示阳历,下边显示阴历,并且含有节日。

    C#实现简单日历控件

    c#实现自定义日历控件,包括日历上一些常用操作~绝对物超所值

    QML 简单日历控件

    一个qml的日历控件 很简单 没有定义很复杂的风格, 代码很简单,如果要改风格 修改spinner.qml也可以很容易做到

    js日历控件js日历控件

    js日历控件js日历控件js日历控件js日历控件js日历控件js日历控件js日历控件js日历控件js日历控件js日历控件

    日历控件.rar 日历控件.rar

    日历控件 日历控件 日历控件日历控件 日历控件 日历控件日历控件 日历控件 日历控件日历控件 日历控件 日历控件日历控件 日历控件 日历控件日历控件 日历控件 日历控件日历控件 日历控件 日历控件

    利用js和css创建日历控件

    使用css和javascript技术实现日历控件,可以更好的对日历的日期进行控制

    js日历控件[超酷超漂亮]

    js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js日历控件[超酷超漂亮]js...

    VBA EXCEL制作日历控件

    在EXCEL中,可以通过双击单元格,调出日历控件,通过对日历控件的操作,将所选日期更新到单元格中,该控件代码完全开放免费,供大家学习和使用,感兴趣的同学可以多多关注www.allmlp.com,让我们共同成长共同学习。

    6个JS日历控件个JS日历控件

    个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件个JS日历控件

    日历控件 简单实用

    日历控件日历控件 简单实用

    Qt 自定义 Calendar 日历控件

    Qt 自定义 Calendar 日历 控件 方便控制 及实现样式表

    简单及使用的JS日历控件

    日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 日历控件 ...

    用JS编写的不错的日历控件源代码

    用JavaScipt编写的日历控件源代码

    很好用的日历控件,日历、控件

    很好用的日历控件,日历、控件很好用的日历控件,日历、控件很好用的日历控件,日历、控件很好用的日历控件,日历、控件

    js 简易的日历控件

    类似QQ邮箱中的简洁版日历,适合放到网页左下角或者后台管理页面的欢迎页面,简洁大方,通用版的

Global site tag (gtag.js) - Google Analytics