问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-15 05:34

我来回答

5个回答

热心网友 时间:2023-10-10 05:20

 

源代码:


  //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

热心网友 时间:2023-10-10 05:20

不知道你是否听说过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。

热心网友 时间:2023-10-10 05:21

有开源的,

http://sourceforge.net/projects/datepicker/追问这jar没有api不知道怎么用

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

热心网友 时间:2023-10-10 05:22

发到邮箱了

热心网友 时间:2023-10-10 05:22

嗯。 。 开源组件 有这个 比如 openSwing 这个开源组件包里就有这种控件。 以前我没事也写了一个这样的东东。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何用易语言实现QQ登录器的QQ号空了就出现“QQ号为空,请输入QQ号... 介绍几首最新的网络歌手唱得网络红歌呗。。谢谢啊 求推荐几首好听的歌,要和徐良风格差不多的 ...男女合唱的】最好多推荐几首,试到一首好听的 有什么蛮好听的新歌吗?网络歌手、非主流的,像汪苏泷、徐良、阿悄他们的... 关于Guitar Rig 4的两个问题,求解答。。。 右脚跟疼是什么原因引起的 男人右脚后跟筋疼的原因 右脚跟痛 我右脚跟腱痛怎么治呀,两个多月前崴了一下,找人捏了几次,但现在跟腱一... 请问您有日历日程,日程添加到数据库的源代码吗 Android系统日历日历提醒的业务流程是怎么样的 mt15i日历里怎么没有农历呢?安卓是不是都这样?谢谢! 谁有APP中华万年历的Android源码?急求 如何读取android里面Calendar的事件 日历安卓源代码导入android studio 如何将鼠标指针变成黑色或者哪里有黑色鼠标指针下载? 五颜六色 正常 的鼠标指针下载啊 求鼠标指针(超可爱) 鼠标指针的问题!!!怎么样变色 右*左左*左*什么意思 怎么把鼠标箭头变色 50赏金 被误封,怎么解决? qq飞车左左中什么意思 手机键盘输入 *右*左左*左* 是什么意思?左和右到底是指哪个键啊? 美菱冰箱雅典娜bcd560冷冻仓不致冷 会变色的鼠标指针那里下载? 抽烟就是小猪,喝酒就是左左 是什么意思啊? 美菱雅典娜冰箱原来一直有变频图标,不小心点没了美菱冰箱突然不制冷_百度问一问 证券市场里的术语 &#39;左侧&#39;是什么意思? 为什么android的日历图标不能显示动态的星期和日子 弹性地板清洁怎么做? 如何根据一根K线来判断股票走势? 写给老师的短信,不少于50字,要运用2钟修辞手法 登记结婚要预约吗 私人放贷款算是违法的吗 五分利息的 有个亲戚是放私贷的。找他买抵押车安全吗?需要什么手续 有放私贷的吗?有房产抵押,急 大学生贷款有放私贷的吗? 有没有放私贷的老板,急需一万 那个人放私贷的我想用一1万元,我做手术钱不够用的,有借的我可以多给利息,就用3个月还钱 楚雄放私贷的有吗? 奎屯有放私贷的么?奎屯哪里有放私贷的? 大学生贷款 可以放私贷的来 急用 张家界、韶山、凤凰古城自驾游怎么好玩?这份自驾游攻略带你玩转湖南... 济南的谁能放私贷,我可以去面签,没有身份证,只有复印件和户口本, 有没有奎屯放私贷的?没有前期的,急需! 湘西凤凰古城两天,怎么避免被坑? 帮别人贷款要怎么维护自己的利益 凤凰古城二日游攻略,玩下来需要要多少钱