日期选择框代码

/*
 * 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);
    }*/
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值