/*
* DateChooser.java
*
* Created on 2007年3月31日, 上午 10:49
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.BorderFactory;
import javax.swing.SwingConstants;
import javax.swing.JSpinner;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.GridBagConstraints;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.MouseListener;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
/**
*
* @author Administrator
*/
public class DateChooser
extends JPanel {
private int width = 220; //日期控件的?度
private int height = 220;//日期控件的高度
private GridBagLayout gridBagLayout1 = new GridBagLayout();
private JTextField dateField = new JTextField();
private DateChooserButton btnChoose = new DateChooserButton("/u25BC");///u25BC是指:▼下拉箭?的unicode?
private String parten;
private Component owner;
/**
* 根据一?所有者和一?日期的?示格式构造一?DateChooser?象。
* <br>
* 使用方法如下:
* <blockquote>
* <table border=0 cellspacing=3 cellpadding=0 summary="Examples of date and time patterns interpreted in the U.S. locale">
* <tr bgcolor="#ccccff">
* <th align=left>Date and Time Pattern
* <th align=left>Result
* <tr>
* <td><code>"yyyy.MM.dd G 'at' HH:mm:ss z"</code>
* <td><code>2001.07.04 AD at 12:08:56 PDT</code>
* <tr bgcolor="#eeeeff">
* <td><code>"EEE, MMM d, ''yy"</code>
* <td><code>Wed, Jul 4, '01</code>
* <tr>
* <td><code>"h:mm a"</code>
* <td><code>12:08 PM</code>
* <tr bgcolor="#eeeeff">
* <td><code>"hh 'o''clock' a, zzzz"</code>
* <td><code>12 o'clock PM, Pacific Daylight Time</code>
* <tr>
* <td><code>"K:mm a, z"</code>
* <td><code>0:08 PM, PDT</code>
* <tr bgcolor="#eeeeff">
* <td><code>"yyyyy.MMMMM.dd GGG hh:mm aaa"</code>
* <td><code>02001.July.04 AD 12:08 PM</code>
* <tr>
* <td><code>"EEE, d MMM yyyy HH:mm:ss Z"</code>
* <td><code>Wed, 4 Jul 2001 12:08:56 -0700</code>
* <tr bgcolor="#eeeeff">
* <td><code>"yyMMddHHmmssZ"</code>
* <td><code>010704120856-0700</code>
* <tr>
* <td><code>"yyyy-MM-dd'T'HH:mm:ss.SSSZ"</code>
* <td><code>2001-07-04T12:08:56.235-0700</code>
* </table>
* </blockquote>
*
* 日期??框的所有者必?是Frame或者是JFrame?象。
* <br>
* @param owner Frame 日期??框的所有者
* @param partten String :日期格式
*/
public DateChooser(JPanel owner,Rectangle r, String partten) {
this.owner = owner;
this.parten = partten;
try {
init();
this.setOpaque(false);
setBounds(r.x+r.width+9,r.y-3,130,25);
owner.add(this);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 以缺省的partten构建DateChooser?象
* 日期??框的所有者必?是Frame或者是JFrame?象。
* @param owner Frame:日期??框的所有者
*/
public DateChooser(JPanel owner,Rectangle r) {
this.owner = owner;
this.parten = "yyyy/MM/dd";
try {
init();
this.setOpaque(false);
setBounds(r.x+r.width+9,r.y-3,130,25);
owner.add(this);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public DateChooser(JPanel owner) {
this.owner = owner;
this.parten = "yyyy/MM/dd";
try {
init();
this.setOpaque(false);
//owner.add(this);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 系?初始化
* @throws Exception
*/
private void init()
throws Exception {
dateField.setToolTipText("點擊右邊按鈕選擇日期!");
btnChoose.setToolTipText("選擇日期!");
this.setLayout(gridBagLayout1);
//dateField.setEditable(false);
btnChoose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
DateChooser.this.btnChoose_actionPerformed(e);
}
});
//初始化文本域中的值
Date date=new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat(parten);
//this.setText(simpleDateFormat.format(date));
this.add(dateField, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
, GridBagConstraints.CENTER,
GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), 100, 0));
this.add(btnChoose, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0
, GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), 0, 0));
}
public void setToolTipText(String text) {
dateField.setToolTipText(text);
btnChoose.setToolTipText(text);
}
/**
* 下拉按?的事件?理
* @param e ActionEvent
*/
public void btnChoose_actionPerformed(ActionEvent e) {
// Point p=txtDate.getLocation();
java.awt.Rectangle r = dateField.getBounds();
Point pOnScreen = dateField.getLocationOnScreen();
Point result = new Point(pOnScreen.x, pOnScreen.y + r.height);
/* Point powner = owner.getLocation();
int offsetX = (pOnScreen.x + width) - (powner.x + owner.getWidth());
int offsetY = (pOnScreen.y + r.height + height) -
(powner.y + owner.getHeight());
if (offsetX > 0)
{
result.x -= offsetX;
}
if (offsetY > 0)
{
result.y -= height + r.height;
}*/
javax.swing.JDialog dateFrame = new javax.swing.JDialog();
dateFrame.setModal(false);
dateFrame.setUndecorated(true);
dateFrame.setLocation(result);
dateFrame.setSize(width, height);
dateFrame.addWindowListener(new WindowAdapter() {
//在任意的非日期?????,?日期???件???非活???,自??放?源。
public void windowDeactivated(WindowEvent e) {
javax.swing.JDialog f = (javax.swing.JDialog) e.getSource();
f.dispose();
}
});
DatePanel datePanel = new DatePanel(dateFrame, parten);
dateFrame.getContentPane().setLayout(new BorderLayout());
dateFrame.getContentPane().add(datePanel);
dateFrame.setVisible(true);
}
/**
* 得到日期控件中的值
* @return String
*/
public String getText() {
return this.dateField.getText();
}
/**
* ?置文本域的值
* @param text String
*/
public void setText(String text) {
this.dateField.setText(text);
}
/**
* ?方法非常有用,是外部直接??的TextField?象。
* @return JTextField
*/
public JTextField getDateField() {
return dateField;
}
/**
* ?部?,日期??控件的主体,封?了所有日期??的?容,主要是一?Panel
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
class DatePanel
extends JPanel implements MouseListener,
ChangeListener {
int startYear = 1970; //默?【最小】?示年份
int lastYear = 2050; //默?【最大】?示年份
Color backGroundColor = Color.GRAY; //底色
//月?表格配色----------------//
Color palletTableColor = Color.WHITE; //日?表底色
Color weekFontColor = Color.blue; //星期文字色
Color dateFontColor = Color.black; //日期文字色
Color weekendFontColor = Color.red; //周末文字色
Color moveButtonColor = Color.GREEN;//鼠?移?的日?底色
Color todayBtnColor=Color.BLUE;//今天的日?底色
//控制?配色------------------//
Color controlLineColor = Color.ORANGE; //控制?底色
Color controlTextColor = Color.BLACK; //控制???文字色
JSpinner yearSpin;
JSpinner monthSpin;
JSpinner hourSpin;
JButton[][] daysButton = new JButton[6][7];
javax.swing.JDialog f;
JPanel dayPanel = new JPanel(); //日期panel
JPanel yearPanel = new JPanel();
public Calendar calendar = Calendar.getInstance();
String pattern;
/**
* 日期??控件放在了非模???框中
* @param target JDialog
* @param pattern String
*/
public DatePanel(javax.swing.JDialog target, String pattern) {
super();
this.f = target;
this.pattern = pattern;
setLayout(new BorderLayout());
setBorder(new LineBorder(backGroundColor, 2));
setBackground(backGroundColor);
initButton(); //初始化放置日期的按?。
createYearAndMonthPanal(); //
this.flushWeekAndDayPanal(calendar); //之前必?先保?放置日期的按?已?初始化。
this.setLayout(new BorderLayout());
this.add(yearPanel, BorderLayout.NORTH);
this.add(dayPanel, BorderLayout.CENTER);
}
/**
* 日期??控件的按?初始化
*/
private void initButton() {
int actionCommandId = 1;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
JButton numberButton = new JButton();
numberButton.setBorder(BorderFactory.createEmptyBorder());
numberButton.setHorizontalAlignment(SwingConstants.CENTER);
numberButton.setActionCommand(String.valueOf(
actionCommandId));
numberButton.addMouseListener(this);
numberButton.setBackground(palletTableColor);
numberButton.setForeground(dateFontColor);
numberButton.setText(String.valueOf(actionCommandId));
numberButton.setPreferredSize(new Dimension(25, 25));
daysButton[i][j] = numberButton;
actionCommandId++;
}
}
}
private Date getNowDate() {
return Calendar.getInstance().getTime();
}
private Calendar getNowCalendar() {
Calendar result = Calendar.getInstance();
return result;
}
public Date getSelectDate() {
return calendar.getTime();
}
/**
* ?建年月日的面板
*/
private void createYearAndMonthPanal() {
Calendar c = getNowCalendar();
int currentYear = c.get(Calendar.YEAR);
int currentMonth = c.get(Calendar.MONTH) + 1;
int currentHour = c.get(Calendar.HOUR_OF_DAY);
yearSpin = new JSpinner(new javax.swing.SpinnerNumberModel(
currentYear,
startYear, lastYear, 1));
monthSpin = new JSpinner(new javax.swing.SpinnerNumberModel(
currentMonth, 1, 12,
1));
hourSpin = new JSpinner(new javax.swing.SpinnerNumberModel(
currentHour, 0, 23,
1));
yearPanel.setLayout(new java.awt.FlowLayout());
yearPanel.setBackground(controlLineColor);
yearSpin.setPreferredSize(new Dimension(48, 20));
yearSpin.setName("Year");
yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
yearSpin.addChangeListener(this);
yearPanel.add(yearSpin);
JLabel yearLabel = new JLabel("年");
yearLabel.setForeground(controlTextColor);
yearPanel.add(yearLabel);
monthSpin.setPreferredSize(new Dimension(35, 20));
monthSpin.setName("Month");
monthSpin.addChangeListener(this);
yearPanel.add(monthSpin);
JLabel monthLabel = new JLabel("月");
monthLabel.setForeground(controlTextColor);
yearPanel.add(monthLabel);
hourSpin.setPreferredSize(new Dimension(35, 20));
hourSpin.setName("Hour");
hourSpin.addChangeListener(this);
yearPanel.add(hourSpin);
JLabel hourLabel = new JLabel("時");
hourLabel.setForeground(controlTextColor);
yearPanel.add(hourLabel);
}
/**
* 根据日期刷新?示面板
* @param c Calendar
*/
private void flushWeekAndDayPanal(Calendar c) {
// c.set
c.set(Calendar.DAY_OF_MONTH, 1);
c.setFirstDayOfWeek(0);
int firstdayofWeek = c.get(Calendar.DAY_OF_WEEK);
int lastdayofWeek = c.getActualMaximum(Calendar.DAY_OF_MONTH);
String colname[] =
{
"日", "一", "二", "三", "四", "五", "六"};
int today=getNowCalendar().get(Calendar.DAY_OF_MONTH);
//?置固定字体,以免?用?境改?影?界面美?
dayPanel.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 11));
dayPanel.setLayout(new GridBagLayout());
dayPanel.setBackground(Color.WHITE);
JLabel cell;
for (int i = 0; i < 7; i++) {
cell = new JLabel(colname[i]);
cell.setHorizontalAlignment(JLabel.CENTER);
cell.setPreferredSize(new Dimension(25, 25));
if (i == 0 || i == 6) {
cell.setForeground(weekendFontColor);
} else {
cell.setForeground(weekFontColor);
}
dayPanel.add(cell, new GridBagConstraints(i, 0, 1, 1, 0.0, 0.0
, GridBagConstraints.CENTER,
GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), 0, 0)
);
}
int actionCommandId = 1;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
JButton numberButton = daysButton[i][j];
actionCommandId = Integer.parseInt(numberButton.
getActionCommand());
if (actionCommandId==today) {
numberButton.setBackground(todayBtnColor);
}
if ((actionCommandId + firstdayofWeek - 2) % 7 == 6 ||
(actionCommandId + firstdayofWeek - 2) % 7 == 0) {
numberButton.setForeground(weekendFontColor);
} else {
numberButton.setForeground(dateFontColor);
}
if (actionCommandId <= lastdayofWeek) {
int y = 0;
if ((firstdayofWeek - 1) <=
(j + firstdayofWeek - 1) % 7) {
y = i + 1;
} else {
y = i + 2;
}
dayPanel.add(numberButton,
new GridBagConstraints((j + firstdayofWeek -
1) %
7, y, 1, 1, 0.0, 0.0
, GridBagConstraints.CENTER,
GridBagConstraints.NONE,
new Insets(0, 0, 0, 0), 0, 0)
);
}
}
}
}
private int getSelectedYear() {
return ((Integer) yearSpin.getValue()).intValue();
}
private int getSelectedMonth() {
return ((Integer) monthSpin.getValue()).intValue();
}
private int getSelectedHour() {
return ((Integer) hourSpin.getValue()).intValue();
}
/**
* 年月小?的事件?理
* @param e ChangeEvent
*/
public void stateChanged(ChangeEvent e) {
JSpinner source = (JSpinner) e.getSource();
if (source.getName().equals("Hour")) {
calendar.set(Calendar.HOUR_OF_DAY, getSelectedHour());
return;
}
if (source.getName().equals("Year")) {
calendar.set(Calendar.YEAR, getSelectedYear());
dayPanel.removeAll();
this.flushWeekAndDayPanal(calendar);
dayPanel.revalidate();
dayPanel.updateUI();
return;
}
if (source.getName().equals("Month")) {
calendar.set(Calendar.MONTH, getSelectedMonth() - 1);
dayPanel.removeAll();
this.flushWeekAndDayPanal(calendar);
dayPanel.revalidate();
dayPanel.updateUI();
return;
}
}
/**
* 日期按?的鼠?事件?理
* @param e MouseEvent
*/
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 1) {
JButton source = (JButton) e.getSource();
String value = source.getText();
int day = Integer.parseInt(value);
calendar.set(Calendar.DAY_OF_MONTH, day);
Date selectDate = this.getSelectDate();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
pattern);
DateChooser.this.setText(simpleDateFormat.format(selectDate));
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
// System.out.println(year + "年" + month + "月" + day + "日");
f.dispose();
}
}
public void mousePressed(MouseEvent e) {
//空??接口中的方法,不能?除
}
public void mouseReleased(MouseEvent e) {
//空??接口中的方法,不能?除
}
/**
* 鼠?移?到日?中的事件
* @param e MouseEvent
*/
public void mouseEntered(MouseEvent e) {
JButton jbutton = (JButton) e.getSource();
jbutton.setBackground(moveButtonColor);
}
/**
* 鼠?移出日?中的事件
* @param e MouseEvent
*/
public void mouseExited(MouseEvent e) {
JButton jbutton = (JButton) e.getSource();
int comm=Integer.parseInt(jbutton.getActionCommand());
int today=getNowCalendar().get(Calendar.DAY_OF_MONTH);
if (comm==today) {
jbutton.setBackground(todayBtnColor);
} else {
jbutton.setBackground(palletTableColor);
}
}
}
/**
* ?部?,改?按?的?框不可???,使外?更加??。
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
class DateChooserButton
extends JButton {
public DateChooserButton(String text) {
super(text);
}
/**
*
*?少按?的?框,使按??小,外???。
* @return Insets
*/
public Insets getInsets() {
return new Insets(3, 3, 1, 3);
}
}
/**
* main函??行??
* 直接??即可得到?果。
* @param args String[]
*/
/*public static void main(String[] args)
{
JFrame frame2 = new JFrame();
frame2.getContentPane().setLayout(null);
frame2.setDefaultCloseOperation(javax.swing.WindowConstants.
EXIT_ON_CLOSE);
DateChooser date = new DateChooser(frame2);
date.setBounds(new Rectangle(100, 150, 170, 50));
System.out.println(date.getText());
//date.getBounds()
frame2.getContentPane().add(date);
frame2.setSize(500, 400);
frame2.setVisible(true);
}*/
}