java 显示日历 swing_Java Swing 日历 控件
/***
* 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 日历 控件相关推荐
- java swing 表格控件_java swing 开发 -JTable
最近利用空闲时间自己琢磨了一下java swing 编程,其实在从事javaweb之前我一直向往的就是java swing 开发,不知道为什么可能当时觉得Windows上的exe程序很是神奇,关于wi ...
- 梅花雨做的一个日历 Javascript 页面脚本控件
梅花雨做的一个日历 Javascript 页面脚本控件 比较好用,背景颜色可以自己用替换的形式改 //------------------------------------------------- ...
- 时间表、行程安排表以及日历日程的SilverLight控件MindFusion.Scheduling
MindFusion.Scheduling for Silverlight 控件结合了丰富的时间管理功能并且具有绚丽的界面,是一款理想的用于创建所有类型的时间表.行程安排表以及日历日程的SilverL ...
- html文件显示controls,html5中设置或返回浏览器应当显示标准的音视频控件的属性controls...
实例 为视频启动控件:myVid=document.getElementById("video1"); myVid.controls=true; 定义和用法 controls 属性 ...
- java多文件上传plupload控件实现多图片上传(二)
接上篇 java多文件上传plupload控件实现多图片上传(一) 续写PluploadUtil 和 Plupload PO类,以及后台的action. 至此,可实现多文件上传功能. 上传文件Acti ...
- android gridview控件使用详解_Android开发实现自定义日历、日期选择控件
点击上方蓝字关注 ?? 来源: wenzhihao123 https://www.jianshu.com/p/a2f102c728ce 前言 最近项目需要日历效果,考虑用第三方的反而不太适合设计需求, ...
- java——显示当前月的日历
Java类库中的GregorianCalendar类 今天学习Java核心技术卷1,作者讲述了java中设计Date类和GregorianCalendar类的大概历程,Date类的特点是特定的时间点, ...
- Java显示当前月的日历
下面这个程序将显示当前月的日历,且当前日期用一个*标记,如图: import java.time.DayOfWeek; import java.time.LocalDate;/*** @Author ...
- java分层窗格_Swing拆分窗格控件JSplitPane使用详解
本文实例为大家分享了Swing拆分窗格控件JSplitPane的使用方法,供大家参考,具体内容如下 package day1115; import javax.swing.*; import java ...
最新文章
- !important------至高无上的宝剑
- Centos 安装 Wireshark
- 基于nginx实现minio分布式集群访问的负载均衡配置示例
- Java 数值的二进制中1的个数和整数次方
- 阿里妈妈首次公开新一代自研智能检索模型 | WWW 2018论文解读
- ContentProvider中gettype() 和MIME类型的理解
- 嗅探辅助利器-幻影网盾原理
- poi导出如何设定宽度_POI导出excel列宽自适应
- 极品抓鸡36课------8080端口入侵笔记
- web逻辑思维题目_逻辑思维训练500题
- LayerDate日期插件渲染多个class出现闪现问题解决方案
- 案例3-使用python实现基于opencv的银行卡号识别
- 网页报表等无法打印提示网页上有错误的解决办法
- 如何做IT项目PoC测试
- Guitar Pro2023吉他谱作曲和练习工具
- 《程序员》12月精彩内容:双11技术决战
- FPGA——SPI总线控制flash(1)(含代码)
- flink常见故障排除
- Rstudio必用快捷键
- 烤仔看世界 | 百度、谷歌、微软等巨头争相入局,一场改变AI格局的隐秘拍卖……...
热门文章
- doc命令大全(经典收藏)
- Are You Talking to Me? Reasoned Visual Dialog Generation through Adversarial Learning
- 微信小程序getPhoneNumber方法获取用户手机号
- 帮你全面了解人工智能
- 科普贴开篇:到底什么是人工智能(AI)、机器学习(ML)和深度学习(DL
- javascript中的esm,import, export
- solr之模糊搜索(Fuzzy matching)
- malloc函数未定义
- java morse电码,摩斯电码morse code软件下载-摩斯电码morse code手机版下载v3.80 安卓版-2265安卓网...
- 第一个计算出地球周长的人——埃拉托色尼