/***

* Copyright: Ares.

* All Rights Reserved.

* Company: Insigma HT/上海创图

*@authorAres

private static Color hoverColor = Color.BLUE; //hover color

private Chooser(java.util.Date date, String format, intstartDAY){if(startDAY > -1 && startDAY < 7) defaultStartDAY =startDAY;int dayIndex =defaultStartDAY;for(int i=0; i<7; i++){if(dayIndex > 6) dayIndex = 0;

weekLabels[i]= newWeekLabel(dayIndex, showTEXT[dayIndex]);

dayIndex++;

}

sdf= newjava.text.SimpleDateFormat(format);

calendar=Calendar.getInstance();

calendar.setTime(date);

initCalendarPanel();

}public staticChooser getInstance(java.util.Date date, String format){return newChooser(date, format, defaultStartDAY);

}public staticChooser getInstance(java.util.Date date){returngetInstance(date, DEFAULTFORMAT);

}public staticChooser getInstance(String format){return getInstance(newjava.util.Date(), format);

}public staticChooser getInstance(){return getInstance(newjava.util.Date(), DEFAULTFORMAT);

}private voidinitCalendarPanel(){

calendarPanel= new JPanel(newjava.awt.BorderLayout());

calendarPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0xAA, 0xAA, 0xAA)));

calendarPanel.add(titlePanel= newTitlePanel(), java.awt.BorderLayout.NORTH);

calendarPanel.add(bodyPanel= newBodyPanel(), java.awt.BorderLayout.CENTER);

calendarPanel.add(footerPanel= newFooterPanel(),java.awt.BorderLayout.SOUTH);this.addAncestorListener(newAncestorListener() {public voidancestorAdded(AncestorEvent event) { }public voidancestorRemoved(AncestorEvent event) {hidePanel();}//hide pop when move component.

public voidancestorMoved(AncestorEvent event) {

hidePanel();

}

});

}public void register(finalJComponent showComponent) {this.showDate =showComponent;

showComponent.setRequestFocusEnabled(true);

showComponent.addMouseListener(newMouseAdapter() {public voidmousePressed(MouseEvent me) {

showComponent.requestFocusInWindow();

}

});this.add(showComponent, BorderLayout.CENTER);this.setPreferredSize(new Dimension(90, 25));this.setBorder(BorderFactory.createLineBorder(Color.GRAY));

showComponent.addMouseListener(newMouseAdapter() {public voidmouseEntered(MouseEvent me) {if(showComponent.isEnabled()) {

showComponent.setCursor(newCursor(Cursor.HAND_CURSOR));

}

}public voidmouseExited(MouseEvent me) {if(showComponent.isEnabled()) {

showComponent.setCursor(newCursor(Cursor.DEFAULT_CURSOR));

showComponent.setForeground(Color.BLACK);

}

}public voidmousePressed(MouseEvent me) {if(showComponent.isEnabled()) {

showComponent.setForeground(hoverColor);if(isShow) {

hidePanel();

}else{

showPanel(showComponent);

}

}

}public voidmouseReleased(MouseEvent me) {if(showComponent.isEnabled()) {

showComponent.setForeground(Color.BLACK);

}

}

});

showComponent.addFocusListener(newFocusListener() {public voidfocusLost(FocusEvent e) {

hidePanel();

}public voidfocusGained(FocusEvent e) { }

});

}//hide the main panel.

private voidhidePanel() {if (pop != null) {

isShow= false;

pop.hide();

pop= null;

}

}//show the main panel.

private voidshowPanel(Component owner) {if (pop != null) pop.hide();

Point show= new Point(0, showDate.getHeight());

SwingUtilities.convertPointToScreen(show, showDate);

Dimension size=Toolkit.getDefaultToolkit().getScreenSize();int x =show.x;int y =show.y;if (x < 0) x = 0;if (x > size.width - 212) x = size.width - 212;if (y > size.height - 167) y -= 165;

pop=PopupFactory.getSharedInstance().getPopup(owner, calendarPanel, x, y);

pop.show();

isShow= true;

}//change text or label's content.

private voidcommit() {if (showDate instanceofJTextField) {

((JTextField) showDate).setText(sdf.format(calendar.getTime()));

}else if (showDate instanceofJLabel) {

((JLabel) showDate).setText(sdf.format(calendar.getTime()));

}

hidePanel();

}//control panel

private class TitlePanel extendsJPanel {private static final long serialVersionUID = -2865282186037420798L;privateJLabel preYear,preMonth,center,nextMonth,nextYear,centercontainer;publicTitlePanel(){super(newjava.awt.BorderLayout());this.setBackground(new java.awt.Color(190, 200, 200));

initTitlePanel();

}private voidinitTitlePanel(){

preYear= new JLabel("<

preMonth= new JLabel("

center= new JLabel("", JLabel.CENTER);

centercontainer= new JLabel("", JLabel.CENTER);

nextMonth= new JLabel(">", JLabel.CENTER);

nextYear= new JLabel(">>", JLabel.CENTER);

preYear.setToolTipText("Last Year");

preMonth.setToolTipText("Last Month");

nextMonth.setToolTipText("Next Month");

nextYear.setToolTipText("Next Year");

preYear.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 10, 0, 0));

preMonth.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 15, 0, 0));

nextMonth.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 0, 0, 15));

nextYear.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 0, 0, 10));

centercontainer.setLayout(newjava.awt.BorderLayout());

centercontainer.add(preMonth,java.awt.BorderLayout.WEST);

centercontainer.add(center,java.awt.BorderLayout.CENTER);

centercontainer.add(nextMonth,java.awt.BorderLayout.EAST);this.add(preYear,java.awt.BorderLayout.WEST);this.add(centercontainer,java.awt.BorderLayout.CENTER);this.add(nextYear,java.awt.BorderLayout.EAST);this.setPreferredSize(new java.awt.Dimension(210, 25));

updateDate();

preYear.addMouseListener(new MyMouseAdapter(preYear, Calendar.YEAR, -1));

preMonth.addMouseListener(new MyMouseAdapter(preMonth, Calendar.MONTH, -1));

nextMonth.addMouseListener(new MyMouseAdapter(nextMonth, Calendar.MONTH, 1));

nextYear.addMouseListener(new MyMouseAdapter(nextYear, Calendar.YEAR, 1));

}private voidupdateDate() {

center.setText(calendar.get(Calendar.YEAR)+"-"+(calendar.get(Calendar.MONTH) + 1));

}//listener for control label.

class MyMouseAdapter extendsjava.awt.event.MouseAdapter{

JLabel label;private inttype, value;public MyMouseAdapter(final JLabel label, final int type, final intvalue){this.label =label;this.type =type;this.value =value;

}public voidmouseEntered(java.awt.event.MouseEvent me) {

label.setCursor(newjava.awt.Cursor(java.awt.Cursor.HAND_CURSOR));

label.setForeground(hoverColor);

}public voidmouseExited(java.awt.event.MouseEvent me) {

label.setCursor(newjava.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

label.setForeground(java.awt.Color.BLACK);

}public voidmousePressed(java.awt.event.MouseEvent me) {

calendar.add(type, value);

label.setForeground(java.awt.Color.WHITE);

refresh();

}public voidmouseReleased(java.awt.event.MouseEvent me) {

label.setForeground(java.awt.Color.BLACK);

}

}

}//body panel, include week labels and day labels.

private class BodyPanel extendsJPanel {private static final long serialVersionUID = 5677718768457235447L;publicBodyPanel(){super(new GridLayout(7, 7));this.setPreferredSize(new java.awt.Dimension(210, 140));

initMonthPanel();

}private voidinitMonthPanel(){

updateDate();

}public voidupdateDate() {this.removeAll();

lm.clear();

java.util.Date temp=calendar.getTime();

Calendar cal=Calendar.getInstance();

cal.setTime(temp);

cal.set(Calendar.DAY_OF_MONTH,1);int index =cal.get(Calendar.DAY_OF_WEEK);//从当月1号前移,一直移动到面板显示的第一天的前一天;当-index + defaultStartDAY为正数时,为避免面板从当月1号之后开始显示,需要前移一周,确保当月显示完全

if(index > defaultStartDAY) cal.add(Calendar.DAY_OF_MONTH, -index +defaultStartDAY);else cal.add(Calendar.DAY_OF_MONTH, -index + defaultStartDAY - 7);for(WeekLabel weekLabel : weekLabels) {this.add(weekLabel);

}for (int i = 0; i < 42; i++) {

cal.add(Calendar.DAY_OF_MONTH,1);

lm.addLabel(newDayLabel(cal));

}for(DayLabel my : lm.getLabels()) {this.add(my);

}

}

}private class FooterPanel extendsJPanel {private static final long serialVersionUID = 8135037333899746736L;privateJLabel dateLabel;publicFooterPanel(){super(newBorderLayout());

initFooterPanel();

}private voidinitFooterPanel(){

dateLabel= new JLabel("Today is : "+sdf.format(newjava.util.Date()));

dateLabel.addMouseListener(newMouseListener() {

@Overridepublic voidmouseReleased(MouseEvent e) {}

@Overridepublic voidmousePressed(MouseEvent e) {

calendar.setTime(newDate());

refresh();

commit();

}

@Overridepublic voidmouseExited(MouseEvent e) {

dateLabel.setForeground(Color.BLACK);

}

@Overridepublic voidmouseEntered(MouseEvent e) {

dateLabel.setCursor(newCursor(Cursor.HAND_CURSOR));

dateLabel.setForeground(hoverColor);

}

@Overridepublic voidmouseClicked(MouseEvent e) {}

});this.add(dateLabel);

}public voidupdateDate(){};

}//refresh all panel

private voidrefresh() {

titlePanel.updateDate();

bodyPanel.updateDate();

footerPanel.updateDate();

SwingUtilities.updateComponentTreeUI(this);

}private class WeekLabel extendsJLabel {private static final long serialVersionUID = -8053965084432740110L;privateString name;public WeekLabel(intindex, String name){super(name, JLabel.CENTER);this.name =name;

}publicString toString(){returnname;

}

}private class DayLabel extends JLabel implements java.util.Comparator, java.awt.event.MouseListener, java.awt.event.MouseMotionListener {private static final long serialVersionUID = -6002103678554799020L;private booleanisSelected;private intyear, month, day;publicDayLabel(Calendar cal){super(""+cal.get(Calendar.DAY_OF_MONTH), JLabel.CENTER);this.year =cal.get(Calendar.YEAR);this.month =cal.get(Calendar.MONTH);this.day =cal.get(Calendar.DAY_OF_MONTH);this.setFont(font);this.addMouseListener(this);this.addMouseMotionListener(this);if(month == calendar.get(Calendar.MONTH)) this.setForeground(java.awt.Color.BLACK);else this.setForeground(java.awt.Color.LIGHT_GRAY);

}public booleangetIsSelected() {returnisSelected;

}public void setSelected(boolean b, booleanisDrag) {

isSelected=b;if (b && !isDrag) {int temp =calendar.get(Calendar.MONTH);

calendar.set(year, month, day);if (temp ==month) {

SwingUtilities.updateComponentTreeUI(bodyPanel);

}else{

refresh();

}this.repaint();

}

}

@Overrideprotected voidpaintComponent(Graphics g) {//set curr select day's background

if(day == calendar.get(Calendar.DAY_OF_MONTH) && month ==calendar.get(Calendar.MONTH)){

g.setColor(new java.awt.Color(0xBB, 0xBF, 0xDA));

g.fillRect(0, 0, getWidth(), getHeight());

}//set current day's border

if(year == now.get(Calendar.YEAR) && month == now.get(Calendar.MONTH) && day ==now.get(Calendar.DAY_OF_MONTH)){

Graphics2D gd=(Graphics2D) g;

gd.setColor(new java.awt.Color(0x55, 0x55, 0x88));

Polygon p= newPolygon();

p.addPoint(0, 0);

p.addPoint(getWidth()- 1, 0);

p.addPoint(getWidth()- 1, getHeight() - 1);

p.addPoint(0, getHeight() - 1);

gd.drawPolygon(p);

}if(isSelected){

Stroke s= new BasicStroke(1.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL, 1.0f, new float[] { 2.0f, 2.0f }, 1.0f);

Graphics2D gd=(Graphics2D) g;

gd.setStroke(s);

gd.setColor(Color.BLACK);

Polygon p= newPolygon();

p.addPoint(0, 0);

p.addPoint(getWidth()- 1, 0);

p.addPoint(getWidth()- 1, getHeight() - 1);

p.addPoint(0, getHeight() - 1);

gd.drawPolygon(p);

}super.paintComponent(g);

}public booleancontains(Point p) {return this.getBounds().contains(p);

}private voidupdate() {

repaint();

}

@Overridepublic voidmouseDragged(MouseEvent e) { }

@Overridepublic voidmouseMoved(MouseEvent e) { }

@Overridepublic voidmouseClicked(MouseEvent e) { }

@Overridepublic voidmousePressed(MouseEvent e) {

isSelected= true;

update();

}

@Overridepublic voidmouseReleased(MouseEvent e) {

Point p= SwingUtilities.convertPoint(this, e.getPoint(), bodyPanel);this.setForeground(Color.BLACK);

lm.setSelect(p,false);

commit();

}

@Override//change color when mouse over.

public voidmouseEntered(MouseEvent e) {this.setForeground(hoverColor);this.repaint();

}

@Override//change color when mouse exit.

public voidmouseExited(MouseEvent e) {if(month == calendar.get(Calendar.MONTH)) this.setForeground(java.awt.Color.BLACK);else this.setForeground(java.awt.Color.LIGHT_GRAY);this.repaint();

}

@Overridepublic intcompare(DayLabel o1, DayLabel o2) {

Calendar c1=Calendar.getInstance();

c1.set(o1.year, o1.month, o1.day);

Calendar c2=Calendar.getInstance();

c2.set(o2.year, o2.month, o2.day);returnc1.compareTo(c2);

}

}private classLabelManager {private Listlist;publicLabelManager(){

list= new ArrayList();

}public ListgetLabels(){returnlist;

}public voidaddLabel(DayLabel label){

list.add(label);

}public voidclear() {

list.clear();

}public void setSelect(Point p, booleanb) {//如果是拖动,则要优化一下,以提高效率

if(b) {//表示是否能返回,不用比较完所有的标签,能返回的标志就是把上一个标签和//将要显示的标签找到了就可以了

boolean findPrevious = false, findNext = false;for(DayLabel lab : list) {if(lab.contains(p)) {

findNext= true;if (lab.getIsSelected()) findPrevious = true;else lab.setSelected(true, b);

}else if(lab.getIsSelected()) {

findPrevious= true;

lab.setSelected(false, b);

}if (findPrevious && findNext) return;

}

}else{

DayLabel temp= null;for(DayLabel m : list) {if(m.contains(p)) {

temp=m;

}else if(m.getIsSelected()) {

m.setSelected(false, b);

}

}if (temp != null) temp.setSelected(true, b);

}

}

}/***@paramargs*/

public static voidmain(String[] args) {

JFrame jf= new JFrame("Date Picker Test");

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jf.setLayout(null);

jf.setBounds(400, 200, 600, 400);

Chooser ser=Chooser.getInstance();

javax.swing.JTextField text= newJTextField();

text.setBounds(10, 10, 200, 30);

text.setText("2013-10-11");

ser.register(text);

Chooser ser2= Chooser.getInstance("yyyy年MM月dd日");

JLabel label= new JLabel("please click me.");

label.setBounds(10, 50, 200, 30);

ser2.register(label);

jf.add(text);

jf.add(label);

jf.setVisible(true);

}

}

java 显示日历 swing_Java Swing 日历 控件相关推荐

  1. java swing 表格控件_java swing 开发 -JTable

    最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于wi ...

  2. 梅花雨做的一个日历 Javascript 页面脚本控件

    梅花雨做的一个日历 Javascript 页面脚本控件 比较好用,背景颜色可以自己用替换的形式改 //------------------------------------------------- ...

  3. 时间表、行程安排表以及日历日程的SilverLight控件MindFusion.Scheduling

    MindFusion.Scheduling for Silverlight 控件结合了丰富的时间管理功能并且具有绚丽的界面,是一款理想的用于创建所有类型的时间表.行程安排表以及日历日程的SilverL ...

  4. html文件显示controls,html5中设置或返回浏览器应当显示标准的音视频控件的属性controls...

    实例 为视频启动控件:myVid=document.getElementById("video1"); myVid.controls=true; 定义和用法 controls 属性 ...

  5. java多文件上传plupload控件实现多图片上传(二)

    接上篇 java多文件上传plupload控件实现多图片上传(一) 续写PluploadUtil 和 Plupload PO类,以及后台的action. 至此,可实现多文件上传功能. 上传文件Acti ...

  6. android gridview控件使用详解_Android开发实现自定义日历、日期选择控件

    点击上方蓝字关注 ?? 来源: wenzhihao123 https://www.jianshu.com/p/a2f102c728ce 前言 最近项目需要日历效果,考虑用第三方的反而不太适合设计需求, ...

  7. java——显示当前月的日历

    Java类库中的GregorianCalendar类 今天学习Java核心技术卷1,作者讲述了java中设计Date类和GregorianCalendar类的大概历程,Date类的特点是特定的时间点, ...

  8. Java显示当前月的日历

    下面这个程序将显示当前月的日历,且当前日期用一个*标记,如图: import java.time.DayOfWeek; import java.time.LocalDate;/*** @Author ...

  9. java分层窗格_Swing拆分窗格控件JSplitPane使用详解

    本文实例为大家分享了Swing拆分窗格控件JSplitPane的使用方法,供大家参考,具体内容如下 package day1115; import javax.swing.*; import java ...

最新文章

  1. !important------至高无上的宝剑
  2. Centos 安装 Wireshark
  3. 基于nginx实现minio分布式集群访问的负载均衡配置示例
  4. Java 数值的二进制中1的个数和整数次方
  5. 阿里妈妈首次公开新一代自研智能检索模型 | WWW 2018论文解读
  6. ContentProvider中gettype() 和MIME类型的理解
  7. 嗅探辅助利器-幻影网盾原理
  8. poi导出如何设定宽度_POI导出excel列宽自适应
  9. 极品抓鸡36课------8080端口入侵笔记
  10. web逻辑思维题目_逻辑思维训练500题
  11. LayerDate日期插件渲染多个class出现闪现问题解决方案
  12. 案例3-使用python实现基于opencv的银行卡号识别
  13. 网页报表等无法打印提示网页上有错误的解决办法
  14. 如何做IT项目PoC测试
  15. Guitar Pro2023吉他谱作曲和练习工具
  16. 《程序员》12月精彩内容:双11技术决战
  17. FPGA——SPI总线控制flash(1)(含代码)
  18. flink常见故障排除
  19. Rstudio必用快捷键
  20. 烤仔看世界 | 百度、谷歌、微软等巨头争相入局,一场改变AI格局的隐秘拍卖……...

热门文章

  1. doc命令大全(经典收藏)
  2. Are You Talking to Me? Reasoned Visual Dialog Generation through Adversarial Learning
  3. 微信小程序getPhoneNumber方法获取用户手机号
  4. 帮你全面了解人工智能
  5. 科普贴开篇:到底什么是人工智能(AI)、机器学习(ML)和深度学习(DL
  6. javascript中的esm,import, export
  7. solr之模糊搜索(Fuzzy matching)
  8. malloc函数未定义
  9. java morse电码,摩斯电码morse code软件下载-摩斯电码morse code手机版下载v3.80 安卓版-2265安卓网...
  10. 第一个计算出地球周长的人——埃拉托色尼