http://www.matrix.org.cn/blog/liu2liu2
上次公司需要,搞了一个swing的aapplication的demo,重新弄了一般swing,可惜最后无疾而终,可悲.....
最近离职,把以前的东西整理了一下,觉得多少有点用处,写下算是悼念吧!
这是其中日期选择控件的代码,改编自网上某个程序(记不得了),界面如下所示:
源代码:
//datepicker.java
package com.kxsoft.component;
import java.awt.*;
import java.awt.event.*;
import java.util.gregoriancalendar;
import java.util.date;
import java.util.calendar;
import java.text.dateformat;
import java.text.fieldposition;
import javax.swing.*;
import javax.swing.plaf.borderuiresource;
public final class datepicker extends jpanel {
private static final long serialversionuid = 1l;
private static final int startx = 10;
private static final int starty = 60;
private static final font smallfont = new font("dialog", font.plain, 10);
private static final font largefont = new font("dialog", font.plain, 12);
private static final insets insets = new insets(2, 2, 2, 2);
private static final color highlight = new color(255, 255, 204);
private static final color white = new color(255, 255, 255);
private static final color gray = new color(204, 204, 204);
private component selectedday = null;
private gregoriancalendar selecteddate = null;
private gregoriancalendar originaldate = null;
private boolean hideonselect = true;
private final jbutton backbutton = new jbutton();
private final jlabel monthandyear = new jlabel();
private final jbutton forwardbutton = new jbutton();
private final jlabel[] dayheadings = new jlabel[]{
new jlabel("日"),
new jlabel("一"),
new jlabel("二"),
new jlabel("三"),
new jlabel("四"),
new jlabel("五"),
new jlabel("六")};
private final jlabel[][] daysinmonth = new jlabel[][]{
{new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel()},
{new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel()},
{new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel()},
{new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel()},
{new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel()},
{new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel(),
new jlabel()}
};
private final jbutton todaybutton = new jbutton();
private final jbutton cancelbutton = new jbutton();
public datepicker() {
super();
selecteddate = gettoday();
init();
}
public datepicker(final date initialdate) {
super();
if (null == initialdate)
selecteddate = gettoday();
else
(selecteddate = new gregoriancalendar()).settime(initialdate);
originaldate = new gregoriancalendar(
selecteddate.get(calendar.year),
selecteddate.get(calendar.month),
selecteddate.get(calendar.date));
init();
}
public boolean ishideonselect() {
return hideonselect;
}
public void sethideonselect(final boolean hideonselect) {
if (this.hideonselect != hideonselect) {
this.hideonselect = hideonselect;
initbuttons(false);
}
}
public date getdate() {
if (null != selecteddate)
return selecteddate.gettime();
return null;
}
private void init() {
setlayout(new absolutelayout());
this.setminimumsize(new dimension(161, 226));
this.setmaximumsize(getminimumsize());
this.setpreferredsize(getminimumsize());
this.setborder(new borderuiresource.etchedborderuiresource());
backbutton.setfont(smallfont);
backbutton.settext("<");
backbutton.setmargin(insets);
backbutton.setdefaultcapable(false);
backbutton.addactionlistener(new actionlistener() {
public void actionperformed(final actionevent evt) {
onbackclicked(evt);
}
});
add(backbutton, new absoluteconstraints(10, 10, 20, 20));
monthandyear.setfont(largefont);
monthandyear.sethorizontalalignment(jtextfield.center);
monthandyear.settext(formatdatetext(selecteddate.gettime()));
add(monthandyear, new absoluteconstraints(30, 10, 100, 20));
forwardbutton.setfont(smallfont);
forwardbutton.settext(">");
forwardbutton.setmargin(insets);
forwardbutton.setdefaultcapable(false);
forwardbutton.addactionlistener(new actionlistener() {
public void actionperformed(final actionevent evt) {
onforwardclicked(evt);
}
});
add(forwardbutton, new absoluteconstraints(130, 10, 20, 20));
int x = startx;
for (int ii = 0; ii < dayheadings.length; ii++) {
dayheadings[ii].setopaque(true);
dayheadings[ii].setbackground(color.light_gray);
dayheadings[ii].setforeground(color.white);
dayheadings[ii].sethorizontalalignment(jlabel.center);
add(dayheadings[ii], new absoluteconstraints(x, 40, 21, 21));
x += 20;
}
x = startx;
int y = starty;
for (int ii = 0; ii < daysinmonth.length; ii++) {
for (int jj = 0; jj < daysinmonth[ii].length; jj++) {
daysinmonth[ii][jj].setopaque(true);
daysinmonth[ii][jj].setbackground(white);
daysinmonth[ii][jj].setfont(smallfont);
daysinmonth[ii][jj].sethorizontalalignment(jlabel.center);
daysinmonth[ii][jj].settext("");
daysinmonth[ii][jj].addmouselistener(new mouseadapter() {
public void mouseclicked(final mouseevent evt) {
ondayclicked(evt);
}
});
add(daysinmonth[ii][jj], new absoluteconstraints(x, y, 21, 21));
x += 20;
}
x = startx;
y += 20;
}
initbuttons(true);
calculatecalendar();
}
private void initbuttons(final boolean firsttime) {
if (firsttime) {
final dimension buttonsize = new dimension(68, 24);
todaybutton.settext("今天");
todaybutton.setmargin(insets);
todaybutton.setmaximumsize(buttonsize);
todaybutton.setminimumsize(buttonsize);
todaybutton.setpreferredsize(buttonsize);
todaybutton.setdefaultcapable(true);
todaybutton.setselected(true);
todaybutton.addactionlistener(new actionlistener() {
public void actionperformed(final actionevent evt) {
ontoday(evt);
}
});
cancelbutton.settext("取消");
cancelbutton.setmargin(insets);
cancelbutton.setmaximumsize(buttonsize);
cancelbutton.setminimumsize(buttonsize);
cancelbutton.setpreferredsize(buttonsize);
cancelbutton.addactionlistener(new actionlistener() {
public void actionperformed(final actionevent evt) {
oncancel(evt);
}
});
} else {
this.remove(todaybutton);
this.remove(cancelbutton);
}
if (hideonselect) {
add(todaybutton, new absoluteconstraints(25, 190, 52, -1));
add(cancelbutton, new absoluteconstraints(87, 190, 52, -1));
} else {
add(todaybutton, new absoluteconstraints(55, 190, 52, -1));
}
}
private void ontoday(final java.awt.event.actionevent evt) {
selecteddate = gettoday();
setvisible(!hideonselect);
if (isvisible()) {
monthandyear.settext(formatdatetext(selecteddate.gettime()));
calculatecalendar();
}
}
private void oncancel(final actionevent evt) {
selecteddate = originaldate;
setvisible(!hideonselect);
}
private void onforwardclicked(final java.awt.event.actionevent evt) {
final int day = selecteddate.get(calendar.date);
selecteddate.set(calendar.date, 1);
selecteddate.add(calendar.month, 1);
selecteddate.set(calendar.date,
math.min(day, calculatedaysinmonth(selecteddate)));
monthandyear.settext(formatdatetext(selecteddate.gettime()));
calculatecalendar();
}
private void onbackclicked(final java.awt.event.actionevent evt) {
final int day = selecteddate.get(calendar.date);
selecteddate.set(calendar.date, 1);
selecteddate.add(calendar.month, -1);
selecteddate.set(calendar.date,
math.min(day, calculatedaysinmonth(selecteddate)));
monthandyear.settext(formatdatetext(selecteddate.gettime()));
calculatecalendar();
}
private void ondayclicked(final java.awt.event.mouseevent evt) {
final javax.swing.jlabel fld = (javax.swing.jlabel) evt.getsource();
if (!"".equals(fld.gettext())) {
fld.setbackground(highlight);
selectedday = fld;
selecteddate.set(
calendar.date,
integer.parseint(fld.gettext()));
setvisible(!hideonselect);
}
}
private static gregoriancalendar gettoday() {
final gregoriancalendar gc = new gregoriancalendar();
gc.set(calendar.hour_of_day, 0);
gc.set(calendar.minute, 0);
gc.set(calendar.second, 0);
gc.set(calendar.millisecond, 0);
return gc;
}
private void calculatecalendar() {
if (null != selectedday) {
selectedday.setbackground(white);
selectedday = null;
}
final gregoriancalendar c = new gregoriancalendar(
selecteddate.get(calendar.year),
selecteddate.get(calendar.month),
1);
final int maxday = calculatedaysinmonth(c);
final int selectedday = math.min(maxday, selecteddate.get(
calendar.date));
int dow = c.get(calendar.day_of_week);
for (int dd = 0; dd < dow; dd++) {
daysinmonth[0][dd].settext("");
}
int week;
do {
week = c.get(calendar.week_of_month);
dow = c.get(calendar.day_of_week);
final jlabel fld = this.daysinmonth[week - 1][dow - 1];
fld.settext(integer.tostring(c.get(calendar.date)));
if (selectedday == c.get(calendar.date)) {
fld.setbackground(highlight);
this.selectedday = fld;
}
if (c.get(calendar.date) >= maxday)
break;
c.add(calendar.date, 1);
} while (c.get(calendar.date) <= maxday);
week--;
for (int ww = week; ww < daysinmonth.length; ww++) {
for (int dd = dow; dd < daysinmonth[ww].length; dd++) {
daysinmonth[ww][dd].settext("");
}
dow = 0;
}
c.set(calendar.date, selectedday);
selecteddate = c;
}
private static int calculatedaysinmonth(final calendar c) {
int daysinmonth = 0;
switch (c.get(calendar.month)) {
case 0:
case 2:
case 4:
case 6:
case 7:
case 9:
case 11:
daysinmonth = 31;
break;
case 3:
case 5:
case 8:
case 10:
daysinmonth = 30;
break;
case 1:
final int year = c.get(calendar.year);
daysinmonth =
(0 == year % 1000) ? 29 :
(0 == year % 100) ? 28 :
(0 == year % 4) ? 29 : 28;
break;
}
return daysinmonth;
}
private static string formatdatetext(final date dt) {
final dateformat df = dateformat.getdateinstance(dateformat.long);
final stringbuffer mm = new stringbuffer();
final stringbuffer yy = new stringbuffer();
final fieldposition mmfp = new fieldposition(dateformat.month_field);
final fieldposition yyfp = new fieldposition(dateformat.year_field);
df.format(dt, mm, mmfp);
df.format(dt, yy, yyfp);
return (mm.tostring().substring(mmfp.getbeginindex(), mmfp.getendindex()) +
"月 " + yy.tostring().substring(yyfp.getbeginindex(), yyfp.getendindex()) + "年");
}
}
</pre>
</code>
<code>
<pre class="js src">
//datafield.java
package com.kxsoft.component;
import java.awt.borderlayout;
import java.awt.color;
import java.awt.insets;
import java.awt.point;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.awt.event.componentadapter;
import java.awt.event.componentevent;
import java.awt.event.mouseadapter;
import java.awt.event.mouseevent;
import java.awt.event.mousemotionadapter;
import java.net.url;
import java.text.dateformat;
import java.text.parseexception;
import java.util.date;
import javax.swing.imageicon;
import javax.swing.jbutton;
import javax.swing.jdialog;
import javax.swing.jframe;
import javax.swing.jpanel;
import javax.swing.jtextfield;
public final class datefield extends jpanel {
private static final long serialversionuid = 1l;
private final jtextfield datetext = new jtextfield(12);
private final jbutton dropdownbutton = new jbutton();
private datepicker dp;
private jdialog dlg;
point origin = new point();
final class listener extends componentadapter {
public void componenthidden(final componentevent evt) {
final date dt = ((datepicker) evt.getsource()).getdate();
if (null != dt)
datetext.settext(datetostring(dt));
dlg.dispose();
}
}
public datefield() {
super();
init();
}
public datefield(final date initialdate) {
super();
init();
datetext.settext(datetostring(initialdate));
}
public date getdate() {
return stringtodate(datetext.gettext());
}
public void setdate(date date) {
string v = datetostring(date);
if (v == null) {
v = "";
}
datetext.settext(v);
}
private void init() {
setlayout(new borderlayout());
datetext.settext("");
datetext.seteditable(false);
datetext.setbackground(new color(255, 255, 255));
add(datetext, borderlayout.center);
url url = datefield.class.getresource("/com/kxsoft/component/dropdown.gif");
imageicon icon = new imageicon(url);
dropdownbutton.seticon(icon);
dropdownbutton.setmargin(new insets(2, 2, 2, 2));
dropdownbutton.addactionlistener(new actionlistener() {
public void actionperformed(final actionevent evt) {
onbuttonclick(evt);
}
});
add(dropdownbutton, borderlayout.east);
}
private void onbuttonclick(final java.awt.event.actionevent evt) {
if ("".equals(datetext.gettext()))
dp = new datepicker();
else
dp = new datepicker(stringtodate(datetext.gettext()));
dp.addcomponentlistener(new listener());
final point p = datetext.getlocationonscreen();
p.setlocation(p.getx(), p.gety() - 1 + datetext.getsize().getheight());
dlg = new jdialog(new jframe(), true);
dlg.addmouselistener(new mouseadapter() {
public void mousepressed(mouseevent e) {
origin.x = e.getx();
origin.y = e.gety();
}
});
dlg.addmousemotionlistener(new mousemotionadapter() {
public void mousedragged(mouseevent e) {
point p = dlg.getlocation();
dlg.setlocation(p.x + e.getx() - origin.x, p.y + e.gety() - origin.y);
}
});
dlg.setlocation(p);
dlg.setresizable(false);
dlg.setundecorated(true);
dlg.getcontentpane().add(dp);
dlg.pack();
dlg.setvisible(true);
}
private static string datetostring(final date dt) {
if (null != dt)
return dateformat.getdateinstance(dateformat.long).format(dt);
return null;
}
private static date stringtodate(final string s) {
try {
return dateformat.getdateinstance(dateformat.long).parse(s);
} catch (parseexception e) {
return null;
}
}
public static void main(string[] args) {
jdialog dlg = new jdialog(new jframe(), true);
datefield df = new datefield();
dlg.getcontentpane().add(df);
dlg.pack();
dlg.setvisible(true);
system.out.println(df.getdate().tostring());
system.exit(0);
}
}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器