源码展示(网上转帖代码)
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;
import java.util.Enumeration;
public class AbsoluteLayout implements LayoutManager2, java.io.Serializable {
static final long serialVersionUID = -1919857869177070440L;
protected java.util.Hashtable constraints = new java.util.Hashtable();
public void addLayoutComponent(String name, Component comp) {
throw new IllegalArgumentException();
}
public void removeLayoutComponent(Component comp) {
constraints.remove(comp);
}
public Dimension preferredLayoutSize(Container parent) {
int maxWidth = 0;
int maxHeight = 0;
for (java.util.Enumeration e = constraints.keys(); e.hasMoreElements();) {
Component comp = (Component) e.nextElement();
AbsoluteConstraints ac = (AbsoluteConstraints) constraints
.get(comp);
Dimension size = comp.getPreferredSize();
int width = ac.getWidth();
if (width == -1)
width = size.width;
int height = ac.getHeight();
if (height == -1)
height = size.height;
if (ac.x + width > maxWidth)
maxWidth = ac.x + width;
if (ac.y + height > maxHeight)
maxHeight = ac.y + height;
}
return new Dimension(maxWidth, maxHeight);
}
public Dimension minimumLayoutSize(Container parent) {
int maxWidth = 0;
int maxHeight = 0;
for (java.util.Enumeration e = constraints.keys(); e.hasMoreElements();) {
Component comp = (Component) e.nextElement();
AbsoluteConstraints ac = (AbsoluteConstraints) constraints
.get(comp);
Dimension size = comp.getMinimumSize();
int width = ac.getWidth();
if (width == -1)
width = size.width;
int height = ac.getHeight();
if (height == -1)
height = size.height;
if (ac.x + width > maxWidth)
maxWidth = ac.x + width;
if (ac.y + height > maxHeight)
maxHeight = ac.y + height;
}
return new Dimension(maxWidth, maxHeight);
}
public void layoutContainer(Container parent) {
for (Enumeration e = constraints.keys(); e.hasMoreElements();) {
Component comp = (Component) e.nextElement();
AbsoluteConstraints ac = (AbsoluteConstraints) constraints
.get(comp);
Dimension size = comp.getPreferredSize();
int width = ac.getWidth();
if (width == -1)
width = size.width;
int height = ac.getHeight();
if (height == -1)
height = size.height;
comp.setBounds(ac.x, ac.y, width, height);
}
}
public void addLayoutComponent(Component comp, Object constr) {
if (!(constr instanceof AbsoluteConstraints))
throw new IllegalArgumentException();
constraints.put(comp, constr);
}
public Dimension maximumLayoutSize(Container target) {
return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
}
public float getLayoutAlignmentX(Container target) {
return 0;
}
public float getLayoutAlignmentY(Container target) {
return 0;
}
public void invalidateLayout(Container target) {
}
}
//==================================================
import java.awt.Dimension;
import java.awt.Point;
public class AbsoluteConstraints implements java.io.Serializable {
static final long serialVersionUID = 5261460716622152494L;
public int x;
public int y;
public int width = -1;
public int height = -1;
public AbsoluteConstraints(Point pos) {
this(pos.x, pos.y);
}
public AbsoluteConstraints(int x, int y) {
this.x = x;
this.y = y;
}
public AbsoluteConstraints(Point pos, Dimension size) {
this.x = pos.x;
this.y = pos.y;
if (size != null) {
this.width = size.width;
this.height = size.height;
}
}
public AbsoluteConstraints(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public String toString() {
return super.toString() + " [x=" + x + ", y=" + y + ", width=" + width
+ ", height=" + height + "]";
}
}
//====================================================================
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DateFormat;
import java.text.FieldPosition;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
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 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("Sun"),
new JLabel("Mon"), new JLabel("Tus"), new JLabel("Wed"), new JLabel("Thu"),
new JLabel("Fri"), new JLabel("Sat") };
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.setMinimumSize(new Dimension(300, 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(40, 10, 20, 20));
monthAndYear.setFont(largeFont);
monthAndYear.setHorizontalAlignment(JTextField.CENTER);
monthAndYear.setText(formatDateText(selectedDate.getTime()));
add(monthAndYear, new AbsoluteConstraints(50, 10, 200, 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));
add(forwardButton, new AbsoluteConstraints(240, 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));
add(dayHeadings[ii], new AbsoluteConstraints(x, 40, 40, 21));
// x += 20;
x += 40;
}
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));
add(daysInMonth[ii][jj], new AbsoluteConstraints(x, y, 40, 21));
// x += 20;
x += 40;
}
x = startX;
y += 20;
}
initButtons(true);
calculateCalendar();
}
private void initButtons(final boolean firstTime) {
if (firstTime) {
final Dimension buttonSize = new Dimension(68, 24);
todayButton.setText("Today");
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("Cancel");
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(todayButton, new AbsoluteConstraints(57, 190, 52, -1));
// add(cancelButton, new AbsoluteConstraints(87, 190, 52, -1));
add(cancelButton, new AbsoluteConstraints(187, 190, 52, -1));
} else {
add(todayButton, new AbsoluteConstraints(55, 240, 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
(
yy.toString().substring(yyfp.getBeginIndex(), yyfp.getEndIndex())
+ "-"
// + " Year -"
+mm.toString().substring(mmfp.getBeginIndex(),mmfp.getEndIndex())
// + " Month"
);
}
}
//========================================================
package my;
import java.awt.Point;
import java.awt.Rectangle;
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.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import sun.util.calendar.ZoneInfo;
public class MyCalen extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JButton jButton = null;
private DatePicker dp;
private JTextField dateText = null;
private JDialog dlg;
private Point origin = new Point();
/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(74, 68, 34, 10));
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
onButtonClick(e);
}
});
}
return jButton;
}
private static String dateToString(final Date dt) {
if (null != dt) {
String DATE_FORMAT_SHORT = "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_SHORT);
TimeZone zone = new ZoneInfo("GMT", 0);
sdf.setTimeZone(zone);
return sdf.format(dt);
// return DateFormat.getDateInstance(DateFormat.LONG).format(dt);
}
return null;
}
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();
}
}
private static Date stringToDate(final String s) {
try {
return DateFormat.getDateInstance(DateFormat.LONG).parse(s);
} catch (ParseException e) {
return null;
}
}
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);
}
/**
* This method initializes date
*
* @return javax.swing.JTextField
*/
private JTextField getDate() {
if (dateText == null) {
dateText = new JTextField();
dateText.setBounds(new Rectangle(68, 24, 115, 22));
}
return dateText;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MyCalen thisClass = new MyCalen();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
/**
* This is the default constructor
*/
public MyCalen() {
super();
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);
jContentPane.add(getJButton(), null);
jContentPane.add(getDate(), null);
}
return jContentPane;
}
}
图片实际效果