java swing 日历控件怎么实现 最好是源码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java swing 日历控件怎么实现 最好是源码相关的知识,希望对你有一定的参考价值。

 

源代码:


  //DatePicker.java


  package com.kxsoft.component;


  import java.awt.*;


  import java.awt.event.*;


  import java.util.GregorianCalendar;


  import java.util.Date;


  import java.util.Calendar;


  import java.text.DateFormat;


  import java.text.FieldPosition;


  import javax.swing.*;


  import javax.swing.plaf.BorderUIResource;


  public final class DatePicker extends JPanel 


  private static final long serialVersionUID = 1L;


  private static final int startX = 10;


  private static final int startY = 60;


  private static final Font smallFont = new Font("Dialog", Font.PLAIN, 10);


  private static final Font largeFont = new Font("Dialog", Font.PLAIN, 12);


  private static final Insets insets = new Insets(2, 2, 2, 2);


  private static final Color highlight = new Color(255, 255, 204);


  private static final Color white = new Color(255, 255, 255);


  private static final Color gray = new Color(204, 204, 204);


  private Component selectedDay = null;


  private GregorianCalendar selectedDate = null;


  private GregorianCalendar originalDate = null;


  private boolean hideOnSelect = true;


  private final JButton backButton = new JButton();


  private final JLabel monthAndYear = new JLabel();


  private final JButton forwardButton = new JButton();


  private final JLabel[] dayHeadings = new JLabel[]


  new JLabel("日"),


  new JLabel("一"),


  new JLabel("二"),


  new JLabel("三"),


  new JLabel("四"),


  new JLabel("五"),


  new JLabel("六");


  private final JLabel[][] daysInMonth = new JLabel[][]


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel(),


  new JLabel()


  ;


  private final JButton todayButton = new JButton();


  private final JButton cancelButton = new JButton();


  public DatePicker() 


  super();


  selectedDate = getToday();


  init();


  


  public DatePicker(final Date initialDate) 


  super();


  if (null == initialDate)


  selectedDate = getToday();


  else


  (selectedDate = new GregorianCalendar()).setTime(initialDate);


  originalDate = new GregorianCalendar(


  selectedDate.get(Calendar.YEAR),


  selectedDate.get(Calendar.MONTH),


  selectedDate.get(Calendar.DATE));


  init();


  


  public boolean isHideOnSelect() 


  return hideOnSelect;


  


  public void setHideOnSelect(final boolean hideOnSelect) 


  if (this.hideOnSelect != hideOnSelect) 


  this.hideOnSelect = hideOnSelect;


  initButtons(false);


  


  


  public Date getDate() 


  if (null != selectedDate)


  return selectedDate.getTime();


  return null;


  


  private void init() 


  setLayout(new AbsoluteLayout());


  this.setMinimumSize(new Dimension(161, 226));


  this.setMaximumSize(getMinimumSize());


  this.setPreferredSize(getMinimumSize());


  this.setBorder(new BorderUIResource.EtchedBorderUIResource());


  backButton.setFont(smallFont);


  backButton.setText("<");


  backButton.setMargin(insets);


  backButton.setDefaultCapable(false);


  backButton.addActionListener(new ActionListener() 


  public void actionPerformed(final ActionEvent evt) 


  onBackClicked(evt);


  


  );


  add(backButton, new AbsoluteConstraints(10, 10, 20, 20));


  monthAndYear.setFont(largeFont);


  monthAndYear.setHorizontalAlignment(JTextField.CENTER);


  monthAndYear.setText(formatDateText(selectedDate.getTime()));


  add(monthAndYear, new AbsoluteConstraints(30, 10, 100, 20));


  forwardButton.setFont(smallFont);


  forwardButton.setText(">");


  forwardButton.setMargin(insets);


  forwardButton.setDefaultCapable(false);


  forwardButton.addActionListener(new ActionListener() 


  public void actionPerformed(final ActionEvent evt) 


  onForwardClicked(evt);


  


  );


  add(forwardButton, new AbsoluteConstraints(130, 10, 20, 20));


  int x = startX;


  for (int ii = 0; ii < dayHeadings.length; ii++) 


  dayHeadings[ii].setOpaque(true);


  dayHeadings[ii].setBackground(Color.LIGHT_GRAY);


  dayHeadings[ii].setForeground(Color.WHITE);


  dayHeadings[ii].setHorizontalAlignment(JLabel.CENTER);


  add(dayHeadings[ii], new AbsoluteConstraints(x, 40, 21, 21));


  x += 20;


  


  x = startX;


  int y = startY;


  for (int ii = 0; ii < daysInMonth.length; ii++) 


  for (int jj = 0; jj < daysInMonth[ii].length; jj++) 


  daysInMonth[ii][jj].setOpaque(true);


  daysInMonth[ii][jj].setBackground(white);


  daysInMonth[ii][jj].setFont(smallFont);


  daysInMonth[ii][jj].setHorizontalAlignment(JLabel.CENTER);


  daysInMonth[ii][jj].setText("");


  daysInMonth[ii][jj].addMouseListener(new MouseAdapter() 


  public void mouseClicked(final MouseEvent evt) 


  onDayClicked(evt);


  


  );


  add(daysInMonth[ii][jj], new AbsoluteConstraints(x, y, 21, 21));


  x += 20;


  


  x = startX;


  y += 20;


  


  initButtons(true);


  calculateCalendar();


  


  private void initButtons(final boolean firstTime) 


  if (firstTime) 


  final Dimension buttonSize = new Dimension(68, 24);


  todayButton.setText("今天");


  todayButton.setMargin(insets);


  todayButton.setMaximumSize(buttonSize);


  todayButton.setMinimumSize(buttonSize);


  todayButton.setPreferredSize(buttonSize);


  todayButton.setDefaultCapable(true);


  todayButton.setSelected(true);


  todayButton.addActionListener(new ActionListener() 


  public void actionPerformed(final ActionEvent evt) 


  onToday(evt);


  


  );


  cancelButton.setText("取消");


  cancelButton.setMargin(insets);


  cancelButton.setMaximumSize(buttonSize);


  cancelButton.setMinimumSize(buttonSize);


  cancelButton.setPreferredSize(buttonSize);


  cancelButton.addActionListener(new ActionListener() 


  public void actionPerformed(final ActionEvent evt) 


  onCancel(evt);


  


  );


   else 


  this.remove(todayButton);


  this.remove(cancelButton);


  



参考资料:http://mxcyk.com/?post=407

参考技术A 不知道你是否听说过swingx?它是swinglabs的项目,虽然现在已不再继续,但它提供了非常多好用的Swing扩展组件。其中包括JXDatepicker(日期输入控件),JXMonthView(月视图日历控件)。

swingx你可以到maven库里面搜索Jar包(google "maven repos",出现很多maven库,随便找一个,搜索swingx,找最新的下载。如果你使用maven管理项目,那更好办了,把swingx放入依赖里面即可)。

JXDatepicker的使用方法:
// JXDatePicker提供了编辑器供用户直接输入日期,也提供了右侧按钮,点击按钮出现日期选择期供用户选择日期。
JXDatePicker datePicker = new JXDatePicker();
JXDatePicker datePicker1 = new JXDatePicker(new java.util.Date());
java.util.Date date = datePicker.getDate(); // 用户输入或选择日期后得到日期值
java.util.Date date1 = datePicker1.getDate(); // 用户输入或选择日期后得到日期值
//当然,你也可以指定用户输入日期的格式。
JXDatePicker datePicker2 = new JXDatePicker();
datePicker2.setFormats("yyyy.M.d", "yyyy-M-d");//可同时设置多种格式。setFormats(String...format)

JXMonthView的使用方法:
JXMonthView monthView = new JXMonthView();
monthView.setUnselectableDates(new java.util.Date());// 设置多个不可选择的日期,setUnselectableDates(java.util.Date ... date)
Set<java.util.Date> unselectable = monthView.getSelectionModel().getUnselectableDates();// 获得当前有哪些不可选择日期
monthView.setFlaggedDates(date1,date2)// 设置多个被标记了的日期
Set<java.util.Date> flaggedDates = monthView.getFlaggedDates();// 获得被标记的日期
Calendar calendar = monthView.getCalendar();// 获得日历对象
还有一些可set,get的属性罗列如下:
selectionMode
traversable
firstDayOfWeek
还有更多用法,看API吧。如果使用Maven,你可以自动下载javadoc和javasource。本回答被提问者采纳
参考技术B 有开源的,

http://sourceforge.net/projects/datepicker/追问

这jar没有api不知道怎么用

追答

http://sourceforge.net/projects/jdatepicker/files/
这个有源码,带文档。而且是2010年的。

参考技术C 发到邮箱了
参考技术D 嗯。 。 开源组件 有这个 比如 openSwing 这个开源组件包里就有这种控件。 以前我没事也写了一个这样的东东。

javaScript实现日历控件

      近期学习js。闲来无事就写了个简单的日历控件。不知道别人是怎么实现的。纯粹自己想法写的,

       写的不好 ,但能够起到抛砖引玉的作用。

       先来看效果。

        技术分享

        调用时候的代码 就一句。引入我写的js文件, 前提text框必须有rlk=“rl”  才会被我识别成要做日历控件的文本框, 我回把它设为readonly

        技术分享

       

        js代码也非常easy。一些简单的算法。然后画出div 里面再画个table,依据文本框的位置进行定位即可了。

代码非常easy 大家能够看看。

        我把完整代码和实例放在一起。大家能够去免费下载。

       下载地址:点击打开链接















以上是关于java swing 日历控件怎么实现 最好是源码的主要内容,如果未能解决你的问题,请参考以下文章

java如何内置visio控件

android日历控件

android日历控件

java swing控件JTable 怎么单独设置某一行的颜色

java swing 中的列表框JList如何在程序中动态的添加和删除元素

java swing控件JTable 怎么单独设置某一行的颜色