`

简单的日历控件

阅读更多
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-源码.zip

    《Eson-用于WEB的简单日历控件 v1.1 源码解析与应用探索》 在Web开发中,日历控件是常见的一种交互元素,它为用户提供了一个直观的方式来选择日期,广泛应用于各种在线表单、事件管理、预订系统等场景。Eson-用于...

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

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

    QML 简单日历控件

    下面我们将详细探讨如何在QML中创建一个简单的日历控件,以及相关的知识点。 首先,QML日历控件通常基于`Calendar`组件,这是一个内置的QML类型,位于`QtQuick.Controls`模块中。然而,根据标题和描述,这里我们...

    简单好看的js日历控件

    在网页设计中,一个简单好看的js日历控件可以极大地提升用户体验,尤其是在需要用户输入或选择日期的场景。 创建一个js日历控件,主要涉及以下几个知识点: 1. **DOM操作**:JavaScript通过Document Object Model...

    最简单的日历控件

    本文将深入探讨如何使用XML布局实现一个最简单的日历控件,包括开始时间和结束时间的选择,以及同时展示阳历和阴历及节日的功能。 首先,我们需要在XML布局文件中定义这个日历控件的基础结构。可以使用`GridView`...

    C#实现简单日历控件

    本篇文章将深入探讨如何使用C#来创建一个简单的日历控件,并涵盖其中的一些核心功能和常用操作。 首先,我们需要理解C#中的控件基础。在.NET Framework中,`System.Windows.Forms`命名空间提供了许多预定义的控件,...

    js 简易的日历控件

    在本案例中,我们讨论的是一个“js简易的日历控件”,它旨在提供类似于QQ邮箱中简洁版日历的功能,适合作为网页左下角或后台管理页面欢迎界面的一部分。这个通用版日历控件设计简洁,易于集成,能够增强用户体验。 ...

    一个简单的 .NET 日历控件

    【标题】:“一个简单的 .NET 日历控件” 在.NET框架中,开发人员经常需要创建自定义用户界面元素,以满足特定项目需求。这个“一个简单的 .NET 日历控件”是一个示例,展示了如何扩展.NET的基础控件库,创建一个...

    日历控件大全 - 日历控件

    在IT领域,日历控件是一种常见的用户界面元素,它允许用户方便地选择日期或查看日期安排。在本文中,我们将深入探讨日历控件的种类、用途、设计原则以及如何在不同编程语言和框架中实现和应用这些控件。 首先,让...

    Qt 自定义 Calendar 日历控件

    在本场景中,我们关注的是“Qt自定义Calendar日历控件”。这涉及到使用Qt库中的QCalendarWidget或者完全从头构建一个自定义的日历组件。通过自定义,我们可以更好地控制日历的显示、交互和样式,以适应应用程序的...

    日历控件大集合—各式各样的日历控件

    例如,有的日历控件可能只提供简单的日期选择,而有的则带有事件标记、日期范围选择、时间滑块等功能。此外,一些高级的日历控件还会支持多语言、节假日显示、自定义样式等特性,以适应全球化和个性化需求。 在...

    提供excel 日历控件9.0下载(工具必须的插件)

    在Excel中,日历控件是一种非常实用的功能,它允许用户通过一个直观的日历界面来选择日期,这对于处理与时间相关的数据尤其有用。标题提到的"提供excel 日历控件9.0下载"指的是为不支持或缺少此功能的Excel版本提供...

    日历控件12

    在IT领域,日历控件是一种常见的用户界面元素,它允许用户方便地选择日期或进行日期相关的操作。在“日历控件12”中,我们可能会遇到一系列关于如何集成、自定义以及优化这种控件的知识点。下面将详细介绍这些内容。...

    组态王应用——日历控件的使用

    ### 组态王应用——日历控件的深入解析与实践 #### 一、日历控件概述 在工业自动化领域,组态软件是实现监控与数据采集(SCADA)的关键工具之一。其中,“组态王”作为一款知名的国产组态软件,广泛应用于各种工业...

    html js脚本日历控件

    在JavaScript中,创建一个日历控件主要涉及到DOM操作、事件处理和一些基本的CSS样式设计。下面我们将详细探讨这些知识点: 1. **DOM操作**:HTML文档对象模型(DOM)是HTML和XML文档的编程接口。在JavaScript中,...

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

    日历控件是软件开发中常见的一种用户界面元素,它允许用户方便地选择日期或进行日期相关的操作。在本文中,我们将深入探讨日历控件的设计、实现、用途以及与之相关的技术细节。 首先,日历控件通常分为两种类型:...

    日历控件 简单实用

    本文将深入探讨日历控件的基本概念、功能、应用以及如何实现一个简单实用的日历控件。 首先,日历控件通常出现在需要用户输入日期的场合,比如在线预订系统、事件管理应用或任务调度软件。它减少了用户输入错误的...

Global site tag (gtag.js) - Google Analytics