日期控件----DateChooserJText

日期控件-----------来自于网络。在java sdk 6下通过。该控件继承于文本控件。当双击它时,自动出现日期选择窗口。修改了原来源码中一个已经 不用的方法----show。关于外观,本控件还有一个小小的问题。
 * DataChoose.java
 *
 * Created on 2007-9-13, 13:35:44
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package frelationmainten;

/**
 *
 * @author cloud
 */
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.JTextField;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JSpinner ;
import java.awt.event.MouseAdapter;
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 ;


public class DateChooserJText extends JTextField {
    private DateChooser dateChooser =null;
    private String preLabel ="" ;
    public DateChooserJText() {
        this(getNowDate()) ;
    }
    public DateChooserJText(SimpleDateFormat df , String dateString) {
        this() ;
        setText(df,dateString) ;
    }
    public DateChooserJText(Date date) {
        this("",date);
    }
    public DateChooserJText(String preLabel , Date date) {
        if (preLabel!=null) this.preLabel = preLabel ;
        setDate(date) ;
        setBorder(null) ;
        setCursor(new Cursor(Cursor.HAND_CURSOR)) ;
        super.addMouseListener( new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                if (evt.getClickCount() ==2) {
                     if (dateChooser==null) dateChooser = new DateChooser();
                     Point p = getLocationOnScreen() ;
                     p.y = p.y+30 ;
                     dateChooser.showDateChooser(p) ;
                }
            }
        });
//        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") ;
    }
//覆盖父类的方法
    public void setText(String s) {
        Date date = getNowDate()  ;
        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() ;
        }
    }
    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 = 1700; //默认【最小】显示年份
        int lastYear = 2050; //默认【最大】显示年份
        int width = 200; //界面宽度
        int height = 200; //界面高度
        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);
        }
        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 ) {
            Calendar c = getCalendar() ;
            int currentYear =c.get(Calendar.YEAR);
            int currentMonth =c.get(Calendar.MONTH)+1;
            int currentHour =c.get(Calendar.HOUR_OF_DAY);
            yearSpin.setValue(currentYear);
            monthSpin.setValue(currentMonth);
            hourSpin.setValue(currentHour);
           
            Frame owner =(Frame)SwingUtilities.getWindowAncestor(DateChooserJText.this) ;
            if (dialog==null || dialog.getOwner()!= owner) dialog = createDialog(owner ) ;
            dialog.setLocation(getAppropriateLocation(owner ,position ) ) ;
            flushWeekAndDay() ;
           // dialog.show();
            dialog.setVisible(true);
        }
        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) 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());
        }

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值