java 的日期选择控件_Java日期选择控件

一起学习

一次项目研发中需要日期时间选择控件,

网上提供的不多,

且质量一般,

所以只好自己做,参考了 网上某位同学的 作品 Jave 日期选择控件 DateChooser 。

目前的代码将日期时间选择封装在一个按钮组件内,

应该很好用,支持Application 、Applet

import java.util.Date;

import java.util.Calendar;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.text.ParseException ;

import java.awt.Color ;

import java.awt.Font;

import java.awt.Point ;

import java.awt.Dimension ;

import java.awt.BorderLayout ;

import java.awt.FlowLayout ;

import java.awt.GridLayout ;

import java.awt.Component ;

import java.awt.Cursor ;

import java.awt.Frame ;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseListener;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

//import javax.swing.JFrame;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JPanel;

import javax.swing.JLabel;

import javax.swing.JSpinner ;

import javax.swing.JSpinner.NumberEditor ;

import javax.swing.SpinnerNumberModel;

import javax.swing.SwingUtilities;

import javax.swing.SwingConstants ;

import javax.swing.event.ChangeListener ;

import javax.swing.event.ChangeEvent ;

import javax.swing.border.LineBorder ;

public class DateChooserJButton extends JButton {

private DateChooser dateChooser =null;

private String preLabel ="" ;

public DateChooserJButton() {

this(getNowDate()) ;

}

public DateChooserJButton(SimpleDateFormat df , String dateString) {

this() ;

setText(df,dateString) ;

}

public DateChooserJButton(Date date) {

this("",date);

}

public DateChooserJButton(String preLabel , Date date) {

if (preLabel!=null) this.preLabel = preLabel ;

setDate(date) ;

setBorder(null) ;

setCursor(new Cursor(Cursor.HAND_CURSOR)) ;

super.addActionListener( new ActionListener() {

public void actionPerformed(ActionEvent e) {

if (dateChooser==null) dateChooser = new DateChooser();

Point p = getLocationOnScreen() ;

p.y = p.y 30 ;

dateChooser.showDateChooser(p) ;

}

}) ;

}

private static Date getNowDate() {

return Calendar.getInstance().getTime() ;

}

private static SimpleDateFormat getDefaultDateFormat() {

return new SimpleDateFormat("yyyy年MM月dd日HH时") ;

}

//覆盖父类的方法

public void setText(String s) {

Date date ;

try {

date = getDefaultDateFormat().parse(s) ;

}catch (ParseException e) {

date = getNowDate() ;

}

setDate(date) ;

}

public void setText(SimpleDateFormat df , String s) {

Date date ;

try {

date = df.parse(s) ;

}catch (ParseException e) {

date = getNowDate() ;

}

setDate(date) ;

}

public void setDate(Date date) {

super.setText(preLabel getDefaultDateFormat().format(date));

}

public Date getDate() {

String dateString = getText().substring(preLabel.length());

try {

return getDefaultDateFormat().parse(dateString);

} catch (ParseException e) {

return getNowDate() ;

}

}

//覆盖父类的方法使之无效

public void addActionListener(ActionListener listener ) {

}

private class DateChooser extends JPanel implements ActionListener ,ChangeListener {

int startYear = 1980; //默认【最小】显示年份

int lastYear = 2050; //默认【最大】显示年份

int width = 200; //界面宽度

int height = 200; //界面高度

Color backGroundColor = Color.gray; //底色

//月历表格配色----------------//

Color palletTableColor = Color.white; //日历表底色

Color todayBackColor = Color.orange; //今天背景色

Color weekFontColor = Color.blue; //星期文字色

Color dateFontColor = Color.black; //日期文字色

Color weekendFontColor = Color.red; //周末文字色

//控制条配色------------------//

Color controlLineColor = Color.pink; //控制条底色

Color controlTextColor = Color.white; //控制条标签文字色

Color rbFontColor = Color.white; //RoundBox文字色

Color rbBorderColor = Color.red; //RoundBox边框色

Color rbButtonColor = Color.pink; //RoundBox按钮色

Color rbBtFontColor = Color.red; //RoundBox按钮文字色

JDialog dialog ;

JSpinner yearSpin ;

JSpinner monthSpin ;

JSpinner hourSpin ;

JButton[][] daysButton = new JButton[6][7] ;

DateChooser() {

setLayout(new BorderLayout());

setBorder(new LineBorder(backGroundColor, 2));

setBackground(backGroundColor);

JPanel topYearAndMonth = createYearAndMonthPanal();

add(topYearAndMonth,BorderLayout.NORTH);

JPanel centerWeekAndDay = createWeekAndDayPanal();

add(centerWeekAndDay,BorderLayout.CENTER);

}

private JPanel createYearAndMonthPanal(){

Calendar c = getCalendar() ;

int currentYear =c.get(Calendar.YEAR);

int currentMonth =c.get(Calendar.MONTH) 1;

int currentHour =c.get(Calendar.HOUR_OF_DAY);

JPanel result = new JPanel();

result.setLayout(new FlowLayout());

result.setBackground(controlLineColor);

yearSpin = new JSpinner(new SpinnerNumberModel(currentYear,startYear,lastYear,1));

yearSpin.setPreferredSize(new Dimension(48,20)) ;

yearSpin.setName("Year") ;

yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####")) ;

yearSpin.addChangeListener(this) ;

result.add(yearSpin) ;

JLabel yearLabel = new JLabel("年");

yearLabel.setForeground(controlTextColor);

result.add(yearLabel);

monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth,1,12,1));

monthSpin.setPreferredSize(new Dimension(35,20)) ;

monthSpin.setName("Month") ;

monthSpin.addChangeListener(this) ;

result.add(monthSpin) ;

JLabel monthLabel = new JLabel("月");

monthLabel.setForeground(controlTextColor);

result.add(monthLabel);

hourSpin = new JSpinner(new SpinnerNumberModel(currentHour,0,23,1));

hourSpin.setPreferredSize(new Dimension(35,20)) ;

hourSpin.setName("Hour") ;

hourSpin.addChangeListener(this) ;

result.add(hourSpin) ;

JLabel hourLabel = new JLabel("时");

hourLabel.setForeground(controlTextColor);

result.add(hourLabel);

return result ;

}

private JPanel createWeekAndDayPanal() {

String colname[] = {"日","一","二","三","四","五","六"};

JPanel result = new JPanel();

//设置固定字体,以免调用环境改变影响界面美观

result.setFont(new Font("宋体", Font.PLAIN, 12));

result.setLayout(new GridLayout(7,7));

result.setBackground(Color.white);

JLabel cell ;

for(int i=0;i<7;i ){

cell = new JLabel(colname[i]);

cell.setHorizontalAlignment(JLabel.RIGHT);

if (i==0 || i==6) cell.setForeground(weekendFontColor) ;

else cell.setForeground(weekFontColor) ;

result.add(cell) ;

}

int actionCommandId = 0 ;

for(int i = 0; i < 6; i )

for(int j = 0; j < 7; j ) {

JButton numberButton = new JButton();

numberButton.setBorder(null) ;

numberButton.setHorizontalAlignment(SwingConstants.RIGHT);

numberButton.setActionCommand(String.valueOf(actionCommandId)) ;

numberButton.addActionListener(this) ;

numberButton.setBackground(palletTableColor);

numberButton.setForeground(dateFontColor) ;

if (j==0 || j==6) numberButton.setForeground(weekendFontColor) ;

else numberButton.setForeground(dateFontColor) ;

daysButton[i][j] = numberButton;

result.add(numberButton) ;

actionCommandId ;

}

return result;

}

private JDialog createDialog(Frame owner ) {

JDialog result = new JDialog(owner,"日期时间选择",true) ;

result.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);

result.getContentPane().add(this,BorderLayout.CENTER) ;

result.pack() ;

result.setSize(width, height);

return result ;

}

void showDateChooser(Point position ) {

Frame owner =(Frame)SwingUtilities.getWindowAncestor(DateChooserJButton.this) ;

if (dialog==null || dialog.getOwner()!= owner) dialog = createDialog(owner ) ;

dialog.setLocation(getAppropriateLocation(owner ,position ) ) ;

flushWeekAndDay() ;

dialog.show();

}

Point getAppropriateLocation(Frame owner ,Point position ) {

Point result = new Point(position) ;

Point p = owner.getLocation() ;

int offsetX = (position.x width) - (p.x owner.getWidth() ) ;

int offsetY = (position.y height) - (p.y owner.getHeight() ) ;

if (offsetX >0 ) {

result.x -= offsetX ;

}

if (offsetY >0 ) {

result.y -= offsetY ;

}

return result ;

}

private Calendar getCalendar() {

Calendar result = Calendar.getInstance();

result.setTime(getDate()) ;

return result ;

}

private int getSelectedYear() {

return ((Integer)yearSpin.getValue()).intValue() ;

}

private int getSelectedMonth() {

return ((Integer)monthSpin.getValue()).intValue() ;

}

private int getSelectedHour() {

return ((Integer)hourSpin.getValue()).intValue() ;

}

private void dayColorUpdate(boolean isOldDay) {

Calendar c = getCalendar() ;

int day = c.get(Calendar.DAY_OF_MONTH);

c.set(Calendar.DAY_OF_MONTH,1);

int actionCommandId =day-2 c.get(Calendar.DAY_OF_WEEK) ;

int i = actionCommandId/7;

int j = actionCommandId%7;

if (isOldDay) daysButton[i][j].setForeground(dateFontColor) ;

else daysButton[i][j].setForeground(todayBackColor) ;

}

private void flushWeekAndDay() {

Calendar c = getCalendar() ;

c.set(Calendar.DAY_OF_MONTH,1);

int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH);

int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK) ;

for(int i = 0; i < 6; i ) {

for(int j = 0; j < 7; j ) {

String s="" ;

if (dayNo>=1 && dayNo<=maxDayNo ) s = String.valueOf(dayNo) ;

daysButton[i][j].setText(s) ;

dayNo ;

}

}

dayColorUpdate(false) ;

}

public void stateChanged(ChangeEvent e) {

JSpinner source =(JSpinner)e.getSource() ;

Calendar c = getCalendar() ;

if (source.getName().equals("Hour")) {

c.set(Calendar.HOUR_OF_DAY, getSelectedHour());

setDate(c.getTime());

return ;

}

dayColorUpdate(true) ;

if (source.getName().equals("Year"))

c.set(Calendar.YEAR, getSelectedYear());

else

// (source.getName().equals("Month"))

c.set(Calendar.MONTH, getSelectedMonth()-1);

setDate(c.getTime());

flushWeekAndDay() ;

}

public void actionPerformed(ActionEvent e) {

JButton source =(JButton)e.getSource() ;

if (source.getText().length()==0) return ;

dayColorUpdate(true) ;

source.setForeground(todayBackColor) ;

int newDay = Integer.parseInt(source.getText());

Calendar c = getCalendar() ;

c.set(Calendar.DAY_OF_MONTH,newDay);

setDate(c.getTime());

}

}

}

下载本文示例代码

Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件Java日期选择控件

阅读(66) | 评论(0) | 转发(0) |

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
JAVA开发人员必备是HTML格式的 JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供与字体相关的类和接口。 java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt.print 为通用的打印 API 提供类和接口。 java.beans 包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活提供支持。 java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口。 java.rmi.registry 提供 RMI 注册表的一个类和两个接口。 java.rmi.server 提供支持服务器端 RMI 的类和接口。 java.security 为安全框架提供类和接口。 java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页