博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
日期时间选择器
阅读量:4670 次
发布时间:2019-06-09

本文共 34884 字,大约阅读时间需要 116 分钟。

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

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
, 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
list; public LabelManager() { list = new ArrayList
(); } public List
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); }}

 

转载于:https://www.cnblogs.com/tufujie/p/5387409.html

你可能感兴趣的文章
Problem B: 判断回文字符串
查看>>
谷歌浏览器,添加默认搜索引擎的搜索地址
查看>>
数据结构化与保存
查看>>
C# .net 获取程序运行的路径的几种方法
查看>>
为什么需要Docker?
查看>>
国内5家云服务厂商 HTTPS 安全性测试横向对比
查看>>
how to control project
查看>>
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
Python入门学习笔记4:他人的博客及他人的学习思路
查看>>
webstorm里直接调用命令行
查看>>
关联规则算法之FP growth算法
查看>>
对数组序列进行洗牌
查看>>
决策树
查看>>
团队作业
查看>>
如何避免在简单业务逻辑上面的细节上面出错
查看>>
win7,Ubuntu 12.04 双系统修改启动项顺序三方法
查看>>
python--列表推导式和生成表达式
查看>>
P - Psychos in a Line 单调队列
查看>>
POJ 2653 Pick-up sticks(计算几何)
查看>>