zoukankan      html  css  js  c++  java
  • 日期时间选择器

    日期时间选择器,精确到秒

    GetDate.java

    package com.tfj.demo;
    
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    
    import javax.swing.JButton;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    /**
     * @author Jacksile E-mail:tufujietec@foxmail.com
     * @date 2016年4月13日 下午2:48:54
     * @function
     */
    
    public class GetDate extends JFrame {
        private JFormattedTextField datelineField;
        private DateChooserSecond dateChooser;
        private static int WIDTH = 400;
        private static int HEIGHT = 100;
    
        GetDate() {
    
            JPanel p = new JPanel();
            setContentPane(p);
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            datelineField = new JFormattedTextField(dateFormat);
            Calendar deadline = GregorianCalendar.getInstance();
            datelineField.setValue(deadline.getTime());
            p.add(datelineField);
    
            JButton b = new JButton("时间设置");
            b.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev) {
                    if (dateChooser == null) {
                        dateChooser = new DateChooserSecond(datelineField);
                    }
                    Point p = getLocationOnScreen();
                    p.y = p.y + 30;
                    dateChooser.showDialog("日期时间选择器", p);
                }
            });
            p.add(b);
            setSize(WIDTH, HEIGHT);
            
            //设置放在中间
            Toolkit kit = Toolkit.getDefaultToolkit();
            Dimension screenSize = kit.getScreenSize();
            int screenWidth = screenSize.width;
            int screenHeight = screenSize.height;
            setLocation((screenWidth - WIDTH) / 2, (screenHeight - HEIGHT) / 2);
            
            setVisible(true);
            setTitle("日期时间选择器");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            new GetDate();
        }
    }

    DateChooserSecond.java

    package com.tfj.demo;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dialog;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.Frame;
    import java.awt.GridLayout;
    import java.awt.Point;
    import java.awt.Window;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFormattedTextField;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerNumberModel;
    import javax.swing.SwingConstants;
    import javax.swing.SwingUtilities;
    import javax.swing.border.LineBorder;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    /**
     * @author Jacksile E-mail:tufujietec@foxmail.com
     * @date 2016年4月13日 下午2:47:02
     * @function
     */
    
    public class DateChooserSecond extends JPanel implements ActionListener, ChangeListener {
    
        public DateChooserSecond(JFormattedTextField dateField) {
            this.dateField = dateField;
            setLayout(new BorderLayout());
            setBorder(new LineBorder(backGroundColor, 2));
            setBackground(backGroundColor);
    
            calendar = GregorianCalendar.getInstance();
            JPanel topYearAndMonth = createYMHMSPanel();
            add(topYearAndMonth, BorderLayout.NORTH);
            JPanel centerWeekAndDay = createWeekAndDayPanel();
            add(centerWeekAndDay, BorderLayout.CENTER);
        }
    
        private JPanel createYMHMSPanel() {
            JPanel panel = new JPanel();
            panel.setLayout(new FlowLayout());
            panel.setBackground(controlLineColor);
    
            int currentYear = calendar.get(Calendar.YEAR);
            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);
            panel.add(yearSpin);
    
            JLabel yearLabel = new JLabel("年");
            yearLabel.setForeground(controlTextColor);
            panel.add(yearLabel);
    
            int currentMonth = calendar.get(Calendar.MONTH) + 1;
            monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1, 12, 1));
            monthSpin.setPreferredSize(new Dimension(35, 20));
            monthSpin.setName("Month");
            monthSpin.addChangeListener(this);
            panel.add(monthSpin);
    
            JLabel monthLabel = new JLabel("月");
            monthLabel.setForeground(controlTextColor);
            panel.add(monthLabel);
    
            int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
            hourSpin = new JSpinner(new SpinnerNumberModel(currentHour, 0, 23, 1));
            hourSpin.setPreferredSize(new Dimension(35, 20));
            hourSpin.setName("Hour");
            hourSpin.addChangeListener(this);
            panel.add(hourSpin);
    
            JLabel seperatorLabel = new JLabel(":");
            seperatorLabel.setForeground(controlTextColor);
            panel.add(seperatorLabel);
    
            int currentMinute = calendar.get(Calendar.MINUTE);
            minuteSpin = new JSpinner(new SpinnerNumberModel(currentMinute, 0, 59, 1));
            minuteSpin.setPreferredSize(new Dimension(35, 20));
            minuteSpin.setName("Minute");
            minuteSpin.addChangeListener(this);
            panel.add(minuteSpin);
    
            seperatorLabel = new JLabel(":");
            seperatorLabel.setForeground(controlTextColor);
            panel.add(seperatorLabel);
    
            int currentSecond = calendar.get(Calendar.SECOND);
            secondSpin = new JSpinner(new SpinnerNumberModel(currentSecond, 0, 59, 1));
            secondSpin.setPreferredSize(new Dimension(35, 20));
            secondSpin.setName("Second");
            secondSpin.addChangeListener(this);
            panel.add(secondSpin);
    
            return panel;
        }
    
        private JPanel createWeekAndDayPanel() {
            String colname[] = { "SUN", "MON", "TUE", "WEN", "THU", "FRI", "SAT" };
            JPanel panel = new JPanel();
            // 设置固定字体,以免调用环境改变影响界面美观
            panel.setFont(new Font("SansSerif", Font.PLAIN, 12));
            panel.setLayout(new GridLayout(7, 7));
            panel.setBackground(Color.white);
            JLabel cell = null;
    
            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);
                panel.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);
                    if (j == 0 || j == 6)
                        numberButton.setForeground(weekendFontColor);
                    else
                        numberButton.setForeground(dateFontColor);
                    daysButton[i][j] = numberButton;
                    panel.add(numberButton);
                    actionCommandId++;
                }
            }
    
            return panel;
        }
    
        private JDialog createDialog(String title) {
            Window window = SwingUtilities.getWindowAncestor(dateField);
    
            JDialog dialog = null;
            if (window instanceof Frame) {
                dialog = new DateChooserDialog(this, (Frame) window, title);
            } else {
                dialog = new DateChooserDialog(this, (Dialog) window, title);
            }
    
            dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
            dialog.getContentPane().add(this, BorderLayout.CENTER);
            dialog.pack();
            dialog.setSize(width, height);
    
            return dialog;
        }
    
        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;
        }
    
        void setDateField() {
            dateField.setValue(calendar.getTime());
        }
    
        public void showDialog(String title, Point position) {
            Frame owner = (Frame) SwingUtilities.getWindowAncestor(dateField);
            if (dialog == null || dialog.getOwner() != owner)
                dialog = createDialog(title);
            dialog.setLocation(getAppropriateLocation(owner, position));
    
            flushCalendar();
    
            dialog.setVisible(true);
        }
    
        private void flushCalendar() {
            calendar.setTime((Date) dateField.getValue());
    
            int currentYear = calendar.get(Calendar.YEAR);
            yearSpin.setValue(currentYear);
            int currentMonth = calendar.get(Calendar.MONTH) + 1;
            monthSpin.setValue(currentMonth);
            int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
            hourSpin.setValue(currentHour);
            int currentMinute = calendar.get(Calendar.MINUTE);
            minuteSpin.setValue(currentMinute);
            int currentSecond = calendar.get(Calendar.SECOND);
            secondSpin.setValue(currentSecond);
    
            dayColorUpdate(true);
            flushWeekAndDay();
        }
    
        private void dayColorUpdate(boolean isOldDay) {
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            int actionCommandId = day - 2 + calendar.get(Calendar.DAY_OF_WEEK);
            calendar.set(Calendar.DAY_OF_MONTH, day);
    
            int i = actionCommandId / 7;
            int j = actionCommandId % 7;
            if (isOldDay == true) {
                if (j == 0 || j == 6)
                    daysButton[i][j].setForeground(weekendFontColor);
                else
                    daysButton[i][j].setForeground(dateFontColor);
            } else
                daysButton[i][j].setForeground(todayBackColor);
        }
    
        private void flushWeekAndDay() {
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            int maxDayNo = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            int dayNo = 2 - calendar.get(Calendar.DAY_OF_WEEK);
            calendar.set(Calendar.DAY_OF_MONTH, day);
            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);
        }
    
        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 int getSelectedMinute() {
            return ((Integer) minuteSpin.getValue()).intValue();
        }
    
        private int getSelectedSecond() {
            return ((Integer) secondSpin.getValue()).intValue();
        }
    
        public void stateChanged(ChangeEvent e) {
            JSpinner source = (JSpinner) e.getSource();
    
            if (source.getName().equals("Second")) {
                calendar.set(Calendar.SECOND, getSelectedSecond());
                return;
            }
            if (source.getName().equals("Minute")) {
                calendar.set(Calendar.MINUTE, getSelectedMinute());
                return;
            }
            if (source.getName().equals("Hour")) {
                calendar.set(Calendar.HOUR_OF_DAY, getSelectedHour());
                return;
            }
    
            dayColorUpdate(true);
    
            if (source.getName().equals("Year"))
                calendar.set(Calendar.YEAR, getSelectedYear());
            else
                calendar.set(Calendar.MONTH, getSelectedMonth() - 1);
    
            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.set(Calendar.DAY_OF_MONTH, newDay);
        }
    
        int startYear = 1980; // 默认【最小】显示年份
        int lastYear = 2050; // 默认【最大】显示年份
        int width = 320; // 界面宽度
        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;
        JButton[][] daysButton = new JButton[6][7];
        JSpinner hourSpin;
        JSpinner minuteSpin;
        JSpinner secondSpin;
    
        Calendar calendar = null;
        JFormattedTextField dateField;
    
        private class DateChooserDialog extends JDialog {
            DateChooserDialog(DateChooserSecond dateChooser, Frame frame, String title) {
                super(frame, title, true);
                this.dateChooser = dateChooser;
            }
    
            DateChooserDialog(DateChooserSecond dateChooser, Dialog dialog, String title) {
                super(dialog, title, true);
                this.dateChooser = dateChooser;
            }
    
            public void hide() {
                dateChooser.setDateField();
                super.hide();
            }
    
            private DateChooserSecond dateChooser;
        }
    }

    日期时间选择器,精确到天,相当于日历

    DateChooserDay.java

    package com.tfj.demo;
    
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.Point;
    import java.awt.Polygon;
    import java.awt.Stroke;
    import java.awt.Toolkit;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Comparator;
    import java.util.Date;
    import java.util.List;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.Popup;
    import javax.swing.PopupFactory;
    import javax.swing.SwingUtilities;
    import javax.swing.event.AncestorEvent;
    import javax.swing.event.AncestorListener;
    
    /**
     * @author Jacksile E-mail:tufujietec@foxmail.com
     * @date 2016年4月13日 下午3:32:23
     * @function
     */
    
    public class DateChooserDay extends JPanel {
    
        private static final long serialVersionUID = 4529266044762990227L;
    
        private Date initDate;
        private Calendar now = Calendar.getInstance();
        private Calendar select;
        private JPanel monthPanel;// 月历
        private JP1 jp1;// 四块面板,组成
        private JP2 jp2;
        private JP3 jp3;
        private JP4 jp4;
        private Font font = new Font("宋体", Font.PLAIN, 12);
        private final LabelManager lm = new LabelManager();
        private JLabel showDate; // ,toSelect;
        private SimpleDateFormat sdf;
        private boolean isShow = false;
        private Popup pop;
        private static final int WIDTH = 400;
        private static final int HEIGHT = 100;
    
        /**
         * Creates a new instance of DateChooser
         */
        public DateChooserDay() {
            this(new Date());
        }
    
        public DateChooserDay(Date date) {
            this(date, "yyyy年MM月dd日");
        }
    
        public DateChooserDay(String format) {
            this(new Date(), format);
        }
    
        public DateChooserDay(Date date, String format) {
            initDate = date;
            sdf = new SimpleDateFormat(format);
            select = Calendar.getInstance();
            select.setTime(initDate);
            initPanel();
            initLabel();
        }
    
        /**
         * 是否允许用户选择
         */
        public void setEnabled(boolean b) {
            super.setEnabled(b);
            showDate.setEnabled(b);
        }
    
        /**
         * 得到当前选择框的日期
         */
        public Date getDate() {
            return select.getTime();
        }
    
        // 根据初始化的日期,初始化面板
        private void initPanel() {
            monthPanel = new JPanel(new BorderLayout());
            monthPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
            JPanel up = new JPanel(new BorderLayout());
            up.add(jp1 = new JP1(), BorderLayout.NORTH);
            up.add(jp2 = new JP2(), BorderLayout.CENTER);
            monthPanel.add(jp3 = new JP3(), BorderLayout.CENTER);
            monthPanel.add(up, BorderLayout.NORTH);
            monthPanel.add(jp4 = new JP4(), BorderLayout.SOUTH);
            this.addAncestorListener(new AncestorListener() {
                public void ancestorAdded(AncestorEvent event) {
    
                }
    
                public void ancestorRemoved(AncestorEvent event) {
    
                }
    
                // 只要祖先组件一移动,马上就让popup消失
                public void ancestorMoved(AncestorEvent event) {
                    hidePanel();
                }
            });
        }
    
        // 初始化标签
        private void initLabel() {
            showDate = new JLabel(sdf.format(initDate));
            showDate.setRequestFocusEnabled(true);
            showDate.addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent me) {
                    showDate.requestFocusInWindow();
                }
            });
            // toSelect=new JLabel(sdf.format(initDate));
            // toSelect.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            // toSelect.setRequestFocusEnabled(true);
            this.setBackground(Color.WHITE);
            this.add(showDate, BorderLayout.CENTER);
            // this.add(toSelect,BorderLayout.EAST);
            this.setPreferredSize(new Dimension(90, 25));
            this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
            showDate.addMouseListener(new MouseAdapter() {
                public void mouseEntered(MouseEvent me) {
                    if (showDate.isEnabled()) {
                        showDate.setCursor(new Cursor(Cursor.HAND_CURSOR));
                        showDate.setForeground(Color.RED);
                    }
                }
    
                public void mouseExited(MouseEvent me) {
                    if (showDate.isEnabled()) {
                        showDate.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                        showDate.setForeground(Color.BLACK);
                    }
                }
    
                public void mousePressed(MouseEvent me) {
                    if (showDate.isEnabled()) {
                        showDate.setForeground(Color.CYAN);
                        if (isShow) {
                            hidePanel();
                        } else {
                            showPanel(showDate);
                        }
                    }
                }
    
                public void mouseReleased(MouseEvent me) {
                    if (showDate.isEnabled()) {
                        showDate.setForeground(Color.BLACK);
                    }
                }
            });
            showDate.addFocusListener(new FocusListener() {
                public void focusLost(FocusEvent e) {
                    hidePanel();
                }
    
                public void focusGained(FocusEvent e) {
    
                }
            });
        }
    
        // 根据新的日期刷新
        private void refresh() {
            jp1.updateDate();
            jp3.updateDate();
            SwingUtilities.updateComponentTreeUI(this);
        }
    
        // 提交日期
        private void commit() {
            System.out.println("选中的日期是:" + sdf.format(select.getTime()));
            showDate.setText(sdf.format(select.getTime()));
            hidePanel();
        }
    
        // 隐藏日期选择面板
        private void hidePanel() {
            if (pop != null) {
                isShow = false;
                pop.hide();
                pop = null;
            }
        }
    
        // 显示日期选择面板
        private void showPanel(Component owner) {
            if (pop != null) {
                pop.hide();
            }
            Point show = new Point(0, showDate.getHeight());
            SwingUtilities.convertPointToScreen(show, showDate);
            Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
            int x = show.x;
            int y = show.y;
            if (x < 0) {
                x = 0;
            }
            if (x > size.width - 295) {
                x = size.width - 295;
            }
            if (y < size.height - 170) {
            } else {
                y -= 188;
            }
            pop = PopupFactory.getSharedInstance().getPopup(owner, monthPanel, x, y);
            pop.show();
            isShow = true;
        }
    
        /**
         * 最上面的面板用来显示月份的增减
         */
        private class JP1 extends JPanel {
            JLabel yearleft, yearright, monthleft, monthright, center, centercontainer;
    
            public JP1() {
                super(new BorderLayout());
                this.setBackground(new Color(160, 185, 215));
                initJP1();
            }
    
            private void initJP1() {
                yearleft = new JLabel("  <<", JLabel.CENTER);
                yearleft.setToolTipText("上一年");
                yearright = new JLabel(">>  ", JLabel.CENTER);
                yearright.setToolTipText("下一年");
                yearleft.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
                yearright.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
    
                monthleft = new JLabel("  <", JLabel.RIGHT);
                monthleft.setToolTipText("上一月");
                monthright = new JLabel(">  ", JLabel.LEFT);
                monthright.setToolTipText("下一月");
                monthleft.setBorder(BorderFactory.createEmptyBorder(2, 30, 0, 0));
                monthright.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 30));
    
                centercontainer = new JLabel("", JLabel.CENTER);
                centercontainer.setLayout(new BorderLayout());
                center = new JLabel("", JLabel.CENTER);
    
                centercontainer.add(monthleft, BorderLayout.WEST);
                centercontainer.add(center, BorderLayout.CENTER);
                centercontainer.add(monthright, BorderLayout.EAST);
    
                this.add(yearleft, BorderLayout.WEST);
                this.add(centercontainer, BorderLayout.CENTER);
                this.add(yearright, BorderLayout.EAST);
                this.setPreferredSize(new Dimension(295, 25));
    
                updateDate();
    
                yearleft.addMouseListener(new MouseAdapter() {
                    public void mouseEntered(MouseEvent me) {
                        yearleft.setCursor(new Cursor(Cursor.HAND_CURSOR));
                        yearleft.setForeground(Color.RED);
                    }
    
                    public void mouseExited(MouseEvent me) {
                        yearleft.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                        yearleft.setForeground(Color.BLACK);
                    }
    
                    public void mousePressed(MouseEvent me) {
                        select.add(Calendar.YEAR, -1);
                        yearleft.setForeground(Color.WHITE);
                        refresh();
                    }
    
                    public void mouseReleased(MouseEvent me) {
                        yearleft.setForeground(Color.BLACK);
                    }
                });
                yearright.addMouseListener(new MouseAdapter() {
                    public void mouseEntered(MouseEvent me) {
                        yearright.setCursor(new Cursor(Cursor.HAND_CURSOR));
                        yearright.setForeground(Color.RED);
                    }
    
                    public void mouseExited(MouseEvent me) {
                        yearright.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                        yearright.setForeground(Color.BLACK);
                    }
    
                    public void mousePressed(MouseEvent me) {
                        select.add(Calendar.YEAR, 1);
                        yearright.setForeground(Color.WHITE);
                        refresh();
                    }
    
                    public void mouseReleased(MouseEvent me) {
                        yearright.setForeground(Color.BLACK);
                    }
                });
                monthleft.addMouseListener(new MouseAdapter() {
                    public void mouseEntered(MouseEvent me) {
                        monthleft.setCursor(new Cursor(Cursor.HAND_CURSOR));
                        monthleft.setForeground(Color.RED);
                    }
    
                    public void mouseExited(MouseEvent me) {
                        monthleft.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                        monthleft.setForeground(Color.BLACK);
                    }
    
                    public void mousePressed(MouseEvent me) {
                        select.add(Calendar.MONTH, -1);
                        monthleft.setForeground(Color.WHITE);
                        refresh();
                    }
    
                    public void mouseReleased(MouseEvent me) {
                        monthleft.setForeground(Color.BLACK);
                    }
                });
                monthright.addMouseListener(new MouseAdapter() {
                    public void mouseEntered(MouseEvent me) {
                        monthright.setCursor(new Cursor(Cursor.HAND_CURSOR));
                        monthright.setForeground(Color.RED);
                    }
    
                    public void mouseExited(MouseEvent me) {
                        monthright.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                        monthright.setForeground(Color.BLACK);
                    }
    
                    public void mousePressed(MouseEvent me) {
                        select.add(Calendar.MONTH, 1);
                        monthright.setForeground(Color.WHITE);
                        refresh();
                    }
    
                    public void mouseReleased(MouseEvent me) {
                        monthright.setForeground(Color.BLACK);
                    }
                });
            }
    
            private void updateDate() {
                center.setText(select.get(Calendar.YEAR) + "年" + (select.get(Calendar.MONTH) + 1) + "月");
            }
        }
    
        private class JP2 extends JPanel {
            public JP2() {
                this.setPreferredSize(new Dimension(295, 20));
            }
    
            protected void paintComponent(Graphics g) {
                g.setFont(font);
                g.drawString("星期日 星期一 星期二 星期三 星期四 星期五 星期六", 5, 10);
                g.drawLine(0, 15, getWidth(), 15);
            }
        }
    
        private class JP3 extends JPanel {
            public JP3() {
                super(new GridLayout(6, 7));
                this.setPreferredSize(new Dimension(295, 100));
                initJP3();
            }
    
            private void initJP3() {
                updateDate();
            }
    
            public void updateDate() {
                this.removeAll();
                lm.clear();
                Date temp = select.getTime();
                Calendar select = Calendar.getInstance();
                select.setTime(temp);
                select.set(Calendar.DAY_OF_MONTH, 1);
                int index = select.get(Calendar.DAY_OF_WEEK);
                int sum = (index == 1 ? 8 : index);
                select.add(Calendar.DAY_OF_MONTH, 0 - sum);
                for (int i = 0; i < 42; i++) {
                    select.add(Calendar.DAY_OF_MONTH, 1);
                    lm.addLabel(new MyLabel(select.get(Calendar.YEAR), select.get(Calendar.MONTH),
                            select.get(Calendar.DAY_OF_MONTH)));
                }
                for (MyLabel my : lm.getLabels()) {
                    this.add(my);
                }
                select.setTime(temp);
            }
        }
    
        private class MyLabel extends JLabel implements Comparator<MyLabel>, MouseListener, MouseMotionListener {
            private int year, month, day;
            private boolean isSelected;
    
            public MyLabel(int year, int month, int day) {
                super("" + day, JLabel.CENTER);
                this.year = year;
                this.day = day;
                this.month = month;
                this.addMouseListener(this);
                this.addMouseMotionListener(this);
                this.setFont(font);
                if (month == select.get(Calendar.MONTH)) {
                    this.setForeground(Color.BLACK);
                } else {
                    this.setForeground(Color.LIGHT_GRAY);
                }
                if (day == select.get(Calendar.DAY_OF_MONTH)) {
                    this.setBackground(new Color(160, 185, 215));
                } else {
                    this.setBackground(Color.WHITE);
                }
            }
    
            public boolean getIsSelected() {
                return isSelected;
            }
    
            public void setSelected(boolean b, boolean isDrag) {
                isSelected = b;
                if (b && !isDrag) {
                    int temp = select.get(Calendar.MONTH);
                    select.set(year, month, day);
                    if (temp == month) {
                        SwingUtilities.updateComponentTreeUI(jp3);
                    } else {
                        refresh();
                    }
                }
                this.repaint();
            }
    
            protected void paintComponent(Graphics g) {
                if (day == select.get(Calendar.DAY_OF_MONTH) && month == select.get(Calendar.MONTH)) {
                    // 如果当前日期是选择日期,则高亮显示
                    g.setColor(new Color(160, 185, 215));
                    g.fillRect(0, 0, getWidth(), getHeight());
                }
                if (year == now.get(Calendar.YEAR) && month == now.get(Calendar.MONTH)
                        && day == now.get(Calendar.DAY_OF_MONTH)) {
                    // 如果日期和当前日期一样,则用红框
                    Graphics2D gd = (Graphics2D) g;
                    gd.setColor(Color.RED);
                    Polygon p = new Polygon();
                    p.addPoint(0, 0);
                    p.addPoint(getWidth() - 1, 0);
                    p.addPoint(getWidth() - 1, getHeight() - 1);
                    p.addPoint(0, getHeight() - 1);
                    gd.drawPolygon(p);
                }
                if (isSelected) {// 如果被选中了就画出一个虚线框出来
                    Stroke s = new BasicStroke(1.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL, 1.0f,
                            new float[] { 2.0f, 2.0f }, 1.0f);
                    Graphics2D gd = (Graphics2D) g;
                    gd.setStroke(s);
                    gd.setColor(Color.BLACK);
                    Polygon p = new Polygon();
                    p.addPoint(0, 0);
                    p.addPoint(getWidth() - 1, 0);
                    p.addPoint(getWidth() - 1, getHeight() - 1);
                    p.addPoint(0, getHeight() - 1);
                    gd.drawPolygon(p);
                }
                super.paintComponent(g);
            }
    
            public boolean contains(Point p) {
                return this.getBounds().contains(p);
            }
    
            private void update() {
                repaint();
            }
    
            public void mouseClicked(MouseEvent e) {
            }
    
            public void mousePressed(MouseEvent e) {
                isSelected = true;
                update();
            }
    
            public void mouseReleased(MouseEvent e) {
                Point p = SwingUtilities.convertPoint(this, e.getPoint(), jp3);
                lm.setSelect(p, false);
                commit();
            }
    
            public void mouseEntered(MouseEvent e) {
            }
    
            public void mouseExited(MouseEvent e) {
            }
    
            public void mouseDragged(MouseEvent e) {
                Point p = SwingUtilities.convertPoint(this, e.getPoint(), jp3);
                lm.setSelect(p, true);
            }
    
            public void mouseMoved(MouseEvent e) {
            }
    
            public int compare(MyLabel o1, MyLabel o2) {
                Calendar c1 = Calendar.getInstance();
                c1.set(o1.year, o2.month, o1.day);
                Calendar c2 = Calendar.getInstance();
                c2.set(o2.year, o2.month, o2.day);
                return c1.compareTo(c2);
            }
        }
    
        private class LabelManager {
            private List<MyLabel> list;
    
            public LabelManager() {
                list = new ArrayList<MyLabel>();
            }
    
            public List<MyLabel> getLabels() {
                return list;
            }
    
            public void addLabel(MyLabel my) {
                list.add(my);
            }
    
            public void clear() {
                list.clear();
            }
    
            public void setSelect(MyLabel my, boolean b) {
                for (MyLabel m : list) {
                    if (m.equals(my)) {
                        m.setSelected(true, b);
                    } else {
                        m.setSelected(false, b);
                    }
                }
            }
    
            public void setSelect(Point p, boolean b) {
                // 如果是拖动,则要优化一下,以提高效率
                if (b) {
                    // 表示是否能返回,不用比较完所有的标签,能返回的标志就是把上一个标签和
                    // 将要显示的标签找到了就可以了
                    boolean findPrevious = false, findNext = false;
                    for (MyLabel m : list) {
                        if (m.contains(p)) {
                            findNext = true;
                            if (m.getIsSelected()) {
                                findPrevious = true;
                            } else {
                                m.setSelected(true, b);
                            }
                        } else if (m.getIsSelected()) {
                            findPrevious = true;
                            m.setSelected(false, b);
                        }
                        if (findPrevious && findNext) {
                            return;
                        }
                    }
                } else {
                    MyLabel temp = null;
                    for (MyLabel m : list) {
                        if (m.contains(p)) {
                            temp = m;
                        } else if (m.getIsSelected()) {
                            m.setSelected(false, b);
                        }
                    }
                    if (temp != null) {
                        temp.setSelected(true, b);
                    }
                }
            }
    
        }
    
        private class JP4 extends JPanel {
            public JP4() {
                super(new BorderLayout());
                this.setPreferredSize(new Dimension(295, 20));
                this.setBackground(new Color(160, 185, 215));
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
                final JLabel jl = new JLabel("今天: " + sdf.format(new Date()));
                jl.setToolTipText("点击选择今天日期");
                this.add(jl, BorderLayout.CENTER);
                jl.addMouseListener(new MouseAdapter() {
                    public void mouseEntered(MouseEvent me) {
                        jl.setCursor(new Cursor(Cursor.HAND_CURSOR));
                        jl.setForeground(Color.RED);
                    }
    
                    public void mouseExited(MouseEvent me) {
                        jl.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                        jl.setForeground(Color.BLACK);
                    }
    
                    public void mousePressed(MouseEvent me) {
                        jl.setForeground(Color.WHITE);
                        select.setTime(new Date());
                        refresh();
                        commit();
                    }
    
                    public void mouseReleased(MouseEvent me) {
                        jl.setForeground(Color.BLACK);
                    }
                });
            }
        }
    
        public static void main(String[] args) {
            final DateChooserDay mp = new DateChooserDay("yyyy-MM-dd");
            JFrame jf = new JFrame("日期选择器");
            jf.add(mp, BorderLayout.CENTER);
            jf.add(new JButton("点击下面可选择时间"), BorderLayout.NORTH);
            jf.setSize(WIDTH, HEIGHT);
            jf.setLocationRelativeTo(null);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
  • 相关阅读:
    flex学习小结
    Frameset框架
    表格的增删改
    【实践】用 js 封装java shuffle函数(打乱数组下标方法)
    【实践】js封装 jq siblings 方法
    【笔记】js原生方法 在元素外部或内部实现添加元素功能(类似jq 的 insert 和 append)
    【实践】js实现windows系统日历
    【实践】用for-in 循环实现三联联动
    【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解
    【笔记】js Function类型 内部方法callee
  • 原文地址:https://www.cnblogs.com/tufujie/p/5387409.html
Copyright © 2011-2022 走看看