怎么编写一个日历选择器然后使选择得日期显示在一个JTextField里。
求完整代码。

解决方案 »

  1.   

    日历.htm
    ================
    <script>
       function BeginTime(id) 

    var timestring = showModalDialog("选择时间.htm", "", "dialogLeft:"+(event.screenX-13)+";dialogTop:"+(event.screenY-15)+";dialogWidth:165px; dialogHeight:205px; edge:raised;help:off;status:off;scroll:off");
    if(timestring!="")
    {
    document.getElementById(id).value = timestring;  
    }   
    }
    </script>
    <input type="text" name="date"><input type="button" value="选择日期" onClick="javascript:BeginTime('date')">
    ==========
    选择时间.htm
    ==========
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <!-- saved from url=(0052)http://www.airticket.com.cn/Component/selecttime.htm -->
    <HTML><HEAD><TITLE>选择时间</TITLE>
    <META http-equiv=Content-Type content="text/html; charset=gb2312">
    <STYLE>.input1 {
    BORDER-RIGHT: black 0px solid; BORDER-TOP: black 0px solid; FONT-SIZE: 9pt; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-LEFT: black 0px solid; CURSOR: hand; COLOR: #0000ff; BORDER-BOTTOM: black 0px solid; FONT-FAMILY: "宋体"; HEIGHT: 15px; TEXT-DECORATION: underline blink
    }
    TD {
    FONT-SIZE: 9pt; FONT-FAMILY: "宋体"
    }
    SELECT {
    FONT-SIZE: 9pt; FONT-FAMILY: "宋体"
    }
    INPUT {
    FONT-SIZE: 9pt; LINE-HEIGHT: 12pt; FONT-FAMILY: "宋体"; HEIGHT: 18px
    }
    </STYLE><SCRIPT language=javascript>
    function checkinput()
      {
        while (isNaN(document.all.years.value) || (document.all.years.value==" ")) 
        {
           document.all.years.value=years.value.substring(0,years.value.length-1)
        }
      }function numberofdays(month,year)
      {
      var numdays=new Array(31,28,31,30,31,30,31,31,30,31,30,31)
      n=numdays[month]
      
      if (month==1&&year%4==0) ++n
      
      return n
      }function displaydates(day,month,year,shade){
      d=new Date(year,month,1)
      var startday=d.getDay()
      var numdays=numberofdays(month,year)
      var numrows=Math.ceil((numdays+startday)/7)  var tmps=""
      if((numdays+startday)%7>1) ++numrows
      var currentdate=0
      
           
      tmps="<table border=0 cellpadding=0 cellspacing=0><tr><td align='center'>日</td><td align='center'>一</td><td align='center'>二</td><td align='center'>三</td><td align='center'>四</td><td align='center'>五</td><td align='center'>六</td></tr><tr ><td colspan=7 height=5 ></td></tr><tr><td colspan=7 bgcolor=black><spacer height=1 type=block></td></tr>"
      for (var i=0;i<numrows;++i)
        {
        tmps=tmps+"<tr>"
        for(var j=0;j<7;++j){
         if (shade&&day==currentdate&&currentdate<numdays&&i*7+j>=startday)
           tmps=tmps+"<td bgcolor='#DDDDDD' style='border:1px solid #909090'>"
           else tmps=tmps+"<td>"
         if(currentdate>=numdays) tmps=tmps+" "
           else if(currentdate>0){
            ++currentdate
            tmps=tmps+writedate(currentdate)
            } else if(i*7+j>=startday){
            ++currentdate
            tmps=tmps+writedate(currentdate)
            }else tmps=tmps+" "
         tmps=tmps+"</td>"
         }
        tmps=tmps+"</tr>"
        }
      tmps=tmps+"<tr ><td colspan=7 height=5 ></td></tr><td colspan=7 bgcolor=black><spacer height=1 type=block></td></tr><tr ><td colspan=7 align=center><br>"
      
      tmps=tmps+"<input type='button' class=input1 value='关闭' style='width:23' onclick='setvalue1(2)'></td></tr></table>"
      return tmps
      }
              
    function writedate(n){
    return "<input type='button' class=input1 value='"+n.toString()+"' style='width:20' onclick='setvalue("+n.toString()+")'>"
    }function setvalue(n)
      {
      window.returnValue=document.all.years.value+"-"+document.all.months.value+"-"+n
      document.all.days.value=n.toString()
      window.close();
      }
    function setvalue1(n)
      {
      //window.returnValue=document.all.years.value+"-"+document.all.months.value+"-"+n
      document.all.days.value=n.toString()
      window.close();
      }function showdates()
      {  if ((event.x+150)>document.body.offsetWidth )
        datesbox.style.left=event.x+document.body.scrollLeft-150
        else
        datesbox.style.left=event.x+document.body.scrollLeft
      if ((event.y+165)>document.body.offsetHeight )  
        datesbox.style.top=event.y+document.body.scrollTop-165
        else
        datesbox.style.top=event.y+document.body.scrollTop
      if (datesbox.style.visibility=="visible")
        datesbox.style.visibility="hidden"
        else
        datesbox.style.visibility="visible"
      yearadd(0)
      }function showdates2()
      {
      if (datesbox.style.visibility=="visible")
        datesbox.style.visibility="hidden"
        }
      
    function changeit(d,m,y)
      {
      daysin.innerHTML=displaydates(d,m-1,y,true)
      }
      
    function yearadd(n)
      {
      years.value=(eval(years.value)+n).toString()  changeit(eval(days.value)-1,eval(months.value),eval(years.value))
      }
      
    </SCRIPT><META content="MSHTML 6.00.3790.0" name=GENERATOR></HEAD>
    <BODY oncontextmenu="return false;" style="FONT-SIZE: 9pt">
    <DIV align=center>
    <TABLE id=datesbox height=23 cellSpacing=0 cellPadding=2 width=151 border=0>
      <TBODY>
      <TR>
        <TD align=middle width=40 rowSpan=2><INPUT type=hidden size=2 name=days> 
          <INPUT onblur=checkinput() 
          onkeyup=checkinput();changeit(eval(days.value),eval(months.value),eval(years.value)) 
          maxLength=4 size=4 value=0 name=years> </TD>
        <TD vAlign=bottom width=20 height=11>
          <DIV style="CURSOR: hand" onclick=yearadd(1) name="yearup"><IMG height=6 
          alt=年份向后 src="选择时间_files/up.jpg" width=9></DIV></TD>
        <TD width=79 rowSpan=2><SELECT style="length: 320" 
          onchange=changeit(eval(days.value)-1,eval(months.value),eval(years.value)) 
          name=months> <OPTION value=1 selected>一月</OPTION> <OPTION 
            value=2>二月</OPTION> <OPTION value=3>三月</OPTION> <OPTION 
            value=4>四月</OPTION> <OPTION value=5>五月</OPTION> <OPTION 
            value=6>六月</OPTION> <OPTION value=7>七月</OPTION> <OPTION 
            value=8>八月</OPTION> <OPTION value=9>九月</OPTION> <OPTION 
            value=10>十月</OPTION> <OPTION value=11>十一月</OPTION> <OPTION 
            value=12>十二月</OPTION></SELECT> </TD></TR>
      <TR>
        <TD vAlign=top width=20>
          <DIV style="CURSOR: hand" onclick=yearadd(-1) name="yeardown" 
          valign="top"><IMG height=6 alt=年份向前 src="选择时间_files/down.jpg" 
          width=9></DIV></TD></TR></TBODY></TABLE>
    <DIV id=daysin style="PADDING-TOP: 4px"></DIV></DIV>
    <SCRIPT language=javascript>
    //显示时间
    function initdates()
    {
       var d=new Date()
      
       days.value=d.getDate()
       months.value=d.getMonth()+1
       years.value=d.getYear()
       window.returnValue = ""
       //window.returnValue=d.getYear().toString()+"-"+(d.getMonth()+1).toString()+"-"+(d.getDate()).toString()
       daysin.innerHTML=displaydates(d.getDate()-1,d.getMonth(),d.getYear(),true)
    }
    initdates();
    </SCRIPT>
    </BODY></HTML>
      

  2.   

    对不起各位兄弟了,我没说清楚。
    我的意思是我的那JTextField是在一个JFrame里,然后我需要的是在我点选JTextField的时候出现一个日历选择,然后我选择一个日期,能使该日期以yyyy/mm/dd的形势显示在JTextField里。深蓝忧郁这位兄弟的做法法不是我需要的。但是还是感谢你的方法。
      

  3.   

    不知道这个能不能帮你,希望对你有用,或者有参考。http://www.javaworld.com/javaworld/jw-07-2003/jw-0704-toolbox.html有什么疑问,pm。:)
      

  4.   

    JTextField?我感觉应该用choiceGroup。
      

  5.   

    package dataSelect;
    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 ;
    import javax.swing.JFrame;public class DataSelect extends JButton {public static void main(String [] args){
      JFrame frame=new JFrame();
      JPanel panel=new JPanel();
      DataSelect data=new DataSelect();
      panel.add(data);
      frame.getContentPane().add(panel);
      frame.show();
    }private DateChooser dateChooser =null;private String preLabel ="" ;
    public DataSelect() {
    this(getNowDate()) ;
    }
    public DataSelect(SimpleDateFormat df , String dateString) {
    this() ;
    setText(df,dateString) ;
    }
    public DataSelect(Date date) {
    this("",date);
    }public DataSelect(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 = 1000; //默认【最小】显示年份
    int lastYear = 3000; //默认【最大】显示年份
    int width = 300; //界面宽度
    int height = 250; //界面高度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);}
      

  6.   


    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(DataSelect.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&&(j==0||j==6)) {
      daysButton[i][j].setForeground(weekendFontColor) ;
    }
    else 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());
    }}}