服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java基础应用:日期时间选择控件(代码)

    一次项目研发中需要日期时间选择控件,网上提供的不多,且质量一般,所以只好自己做,参考了网上某位同学的作品jave日期选择控件datechooser 。

    目前的代码将日期时间选择封装在一个按钮组件内,应该很好用,支持application 、applet

code:

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());
}

}

}

扫描关注微信公众号