一个菜鸟的问题急盼解决!大虾们行行好啊

zhouzidane 2006-09-08 02:22:59
怎么编写一个日历选择器然后使选择得日期显示在一个JTextField里。
求完整代码。
...全文
564 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyangsusu 2006-09-12
  • 打赏
  • 举报
回复
提示我内容太长
只能给分开粘了
楼主看看
可以直接跑起来
ouyangsusu 2006-09-12
  • 打赏
  • 举报
回复

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

}



}
ouyangsusu 2006-09-12
  • 打赏
  • 举报
回复
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);

}
mixianger 2006-09-12
  • 打赏
  • 举报
回复
JTextField?我感觉应该用choiceGroup。
zhouzidane 2006-09-12
  • 打赏
  • 举报
回复
高人啊,虽然没达到我要的效果,不过已经解决我的大部分问题了,谢谢。
remote_eyes 2006-09-11
  • 打赏
  • 举报
回复
不知道这个能不能帮你,希望对你有用,或者有参考。

http://www.javaworld.com/javaworld/jw-07-2003/jw-0704-toolbox.html

有什么疑问,pm。:)
zhouzidane 2006-09-11
  • 打赏
  • 举报
回复
自己顶一下
fishyqd 2006-09-11
  • 打赏
  • 举报
回复
呵呵,没做过,帮你顶
kinsey0514 2006-09-10
  • 打赏
  • 举报
回复
帮顶。。
做个记号
zhouzidane 2006-09-08
  • 打赏
  • 举报
回复
对不起各位兄弟了,我没说清楚。
我的意思是我的那JTextField是在一个JFrame里,然后我需要的是在我点选JTextField的时候出现一个日历选择,然后我选择一个日期,能使该日期以yyyy/mm/dd的形势显示在JTextField里。深蓝忧郁这位兄弟的做法法不是我需要的。但是还是感谢你的方法。
lip009 2006-09-08
  • 打赏
  • 举报
回复
日历.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&¤tdate<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>

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧