欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Swing 自定义日期选择控件,swing控件,Swing日期选择器采用

来源: javaer 分享于  点击 37577 次 点评:17

Swing 自定义日期选择控件,swing控件,Swing日期选择器采用


Swing日期选择器采用触发事件的方式,这样的话,就可以将DateChooser添加到任何组件之上,任何组件都可以捕获日期选择的事件,然后进行相应处理1. 如何对事件进行管理,可以查看这个http://my.oschina.net/abian/blog/497296

截图:

package unit;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.EventListener;import java.util.GregorianCalendar;import javax.swing.BorderFactory;import javax.swing.Box;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.SwingConstants;import javax.swing.event.EventListenerList;/** * 日期选择器 采用触发事件的方式,这样的话,就可以将DateChooser添加到任何组件之上, * 任何组件都可以捕获日期选择的事件,然后进行相应处理 *  * @author changwen * @date Aug 26, 2015 */@SuppressWarnings("all")public class DateChooser extends JPanel {    protected Color weekBackgroundColor = new Color(189, 235, 238);    protected Color weekendBtnFontColor = new Color(240, 64, 64); // color    protected Color selectedColor = weekBackgroundColor;    protected Font labelFont = new Font("Arial", Font.PLAIN, 10);    protected Color defaultBtnFontColor = Color.BLACK;    protected Color defaultBtnBackgroundColor = Color.WHITE;    private Calendar cal = null;    private Calendar todayCal = null;    private int year;    private int month;    private int day;    private JPanel controllPanel = null;    private JPanel dateContainerPanel = null;    private JLabel todayLabel = null;    protected DateButton[][] buttonDays = null;    public JComboBox monthChoice;    public JComboBox yearChoice;    protected String[] weekTitle = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };    protected int[] months = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };    private EventListenerList actionListenerList = new EventListenerList();    public DateChooser() {        buttonDays = new DateButton[6][7];        cal = Calendar.getInstance();        todayCal = Calendar.getInstance();        this.year = cal.get(Calendar.YEAR);        this.month = cal.get(Calendar.MONTH);        this.day = cal.get(Calendar.DATE);        JPanel oprPanel = createControlPanel();        this.setLayout(new BorderLayout(0, 0));        dateContainerPanel = new JPanel();        createDayPanel(cal);        setActiveDay(day);        this.add(oprPanel, BorderLayout.NORTH);        this.add(dateContainerPanel, BorderLayout.CENTER);    }    @SuppressWarnings("all")    public JPanel createControlPanel() {        controllPanel = new JPanel();        controllPanel.setBackground(Color.WHITE);        Box hBox = Box.createHorizontalBox();        String strToday = formatDate(todayCal);        todayLabel = new JLabel(strToday);        monthChoice = new JComboBox();        for (int i = 0; i < months.length; i++) {            monthChoice.addItem(months[i]);        }        monthChoice.setSelectedItem(months[month]);        monthChoice.setPreferredSize(new Dimension(monthChoice.getPreferredSize().width,                monthChoice.getPreferredSize().height));        monthChoice.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent ae) {                int i = monthChoice.getSelectedIndex();                if (i >= 0) {                    month = i;                    Calendar cal = new GregorianCalendar(year, month, 1);                    year = cal.get(Calendar.YEAR);                    month = cal.get(Calendar.MONTH);                    createDayPanel(cal);                }            }        });        int currentYear = todayCal.get(Calendar.YEAR);        final int gapYears = 10;        yearChoice = new JComboBox();        for (int i = currentYear - gapYears; i < currentYear + gapYears; i++) {            yearChoice.addItem(i);        }        yearChoice.setSelectedIndex(gapYears);        yearChoice.setPreferredSize(new Dimension(yearChoice.getPreferredSize().width,                yearChoice.getPreferredSize().height));        yearChoice.addActionListener(new ActionListener() {            public void actionPerformed(ActionEvent ae) {                System.out.println(yearChoice.getSelectedIndex());                if (yearChoice.getSelectedIndex() != gapYears) {                    Integer selYear = (Integer) yearChoice.getSelectedItem();                    Calendar cal = new GregorianCalendar(year, month, 1);                    cal.set(Calendar.YEAR, selYear);                    year = cal.get(Calendar.YEAR);                    month = cal.get(Calendar.MONTH);                    createDayPanel(cal);                }            }        });        hBox.add(todayLabel);        hBox.add(Box.createHorizontalStrut(5));        hBox.add(monthChoice);        hBox.add(Box.createHorizontalStrut(8));        hBox.add(yearChoice);        hBox.add(Box.createHorizontalStrut(8));        controllPanel.add(hBox, BorderLayout.NORTH);        return controllPanel;    }    /**     * 创建日期组件     *      * @param cal     *            void     */    public void createDayPanel(Calendar cal) {        dateContainerPanel.removeAll();        dateContainerPanel.revalidate();        cal.set(Calendar.DAY_OF_MONTH, 1);        cal.add(Calendar.MONTH, 1);        cal.add(Calendar.DAY_OF_MONTH, -1);        int weeks = cal.get(Calendar.WEEK_OF_MONTH);        GridLayout grid = new GridLayout(7, 7, 0, 0);        dateContainerPanel.setLayout(grid);        cal.set(Calendar.DAY_OF_MONTH, 1);        int weekday = cal.get(Calendar.DAY_OF_WEEK);        System.out.println("weekday+" + weekday);        cal.add(Calendar.DAY_OF_MONTH, 1 - weekday);        System.out.println("Calendar.DAY_OF_MONTH=" + cal.get(Calendar.DAY_OF_MONTH));        for (int i = 0; i < 7; i++) {            JLabel weekLabel = new JLabel(weekTitle[i], SwingConstants.CENTER);            weekLabel.setFont(labelFont);            weekLabel.setOpaque(true);            weekLabel.setBackground(weekBackgroundColor);            dateContainerPanel.add(weekLabel);        }        DayButtonActionListener dayButtonActionListener = new DayButtonActionListener();        for (int i = 0; i < 6; i++) {            for (int j = 0; j < 7; j++) {                int curMonth = cal.get(Calendar.MONTH);                DateButton button = null;                if (curMonth != month) {                    button = new DateButton(" ");                    button.setEnabled(false);                    button.setBackground(defaultBtnBackgroundColor);                } else {                    int currentDay = cal.get(Calendar.DAY_OF_MONTH);                    button = new DateButton(currentDay + "");                    button.setHorizontalTextPosition(SwingConstants.RIGHT);                    button.setFont(labelFont);                    button.setBackground(defaultBtnBackgroundColor);                    button.setSelectedBackground(weekBackgroundColor);                    if (currentDay == todayCal.get(Calendar.DAY_OF_MONTH) &amp;&amp; month == todayCal.get(Calendar.MONTH)                            &amp;&amp; year == todayCal.get(Calendar.YEAR)) {                        button.setBorder(BorderFactory.createLineBorder(weekendBtnFontColor));                    }                    if (cal.get(Calendar.MONTH) != month) {                        button.setForeground(Color.BLUE);                    }                    if (j == 0 || j == 6) {                        button.setForeground(weekendBtnFontColor);                    } else {                        button.setForeground(defaultBtnFontColor);                    }                }                button.addActionListener(dayButtonActionListener);                buttonDays[i][j] = button;                dateContainerPanel.add(buttonDays[i][j]);                cal.add(Calendar.DAY_OF_MONTH, 1);            }        }    }    /**     * 选中莫一天     *      * @param selectedDay     *            void     */    public void setActiveDay(int selectedDay) {        clearAllActiveDay();        if (selectedDay <= 0) {            day = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);        } else {            day = selectedDay;        }        int leadGap = new GregorianCalendar(year, month, 1).get(Calendar.DAY_OF_WEEK) - 1;        JButton selectedButton = buttonDays[(leadGap + selectedDay - 1) / 7][(leadGap + selectedDay - 1) % 7];        selectedButton.setBackground(weekBackgroundColor);    }    /**     * 清除所有选择的日期     *      */    public void clearAllActiveDay() {        for (int i = 0; i < 6; i++) {            for (int j = 0; j < 7; j++) {                JButton button = buttonDays[i][j];                if (button.getText() != null &amp;&amp; button.getText().trim().length() > 0) {                    button.setBackground(defaultBtnBackgroundColor);                    button.revalidate();                }            }        }    }    /**     * 获取选中的日期     *      * @return String     */    public String getSelectedDate() {        Calendar cal = new GregorianCalendar(year, month, day);        return formatDate(cal);    }    private String formatDate(Calendar cal) {        String pattern = "MM-dd-yyyy";        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);        return dateFormat.format(cal.getTime());    }    class DayButtonActionListener implements ActionListener {        public void actionPerformed(ActionEvent e) {            JButton button = (JButton) e.getSource();            if (button.getText() != null &amp;&amp; button.getText().trim().length() > 0) {                day = Integer.parseInt(button.getText());                setActiveDay(day);                fireActionPerformed(e);// fire button click event                /**                 * 采用触发事件的方式,这样的话,就可以将DateChooser添加到任何组件之上,                 * 任何组件都可以捕获日期选择的事件,然后进行相应处理                 */            }        }    }    public void addActionListener(ActionListener actionListener) {        actionListenerList.add(ActionListener.class, actionListener);    }    public void removeActionListener(ActionListener actionListener) {        actionListenerList.remove(ActionListener.class, actionListener);    }    /**     * 事件管理,触发事件     *      * @param actionEvent     *            void     */    protected void fireActionPerformed(ActionEvent actionEvent) {        EventListener listenerList[] = actionListenerList.getListeners(ActionListener.class);        for (int i = 0, n = listenerList.length; i < n; i++) {            ((ActionListener) listenerList[i]).actionPerformed(actionEvent);        }    }    public static void main(String[] args) {        JFrame frame = new JFrame("xxxxxx");        frame.setSize(400, 300);        final DateChooser datePicker = new DateChooser();        datePicker.addActionListener(new ActionListener() {// 事件捕获                    public void actionPerformed(ActionEvent e) {                        System.out.println(datePicker.getSelectedDate());                    }                });        frame.getContentPane().add(datePicker);        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.setLocationRelativeTo(null);        frame.setVisible(true);    }}//-------自定义按钮--------------package unit;import java.awt.Color;import java.awt.Cursor;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Paint;import java.awt.RenderingHints;import javax.swing.Action;import javax.swing.BorderFactory;import javax.swing.Icon;import javax.swing.JButton;public class DateButton extends JButton {    private static final long serialVersionUID = 1L;    protected Color normalBackground;    protected Color selectedBackground;    public DateButton() {        initAttributes();    }    public DateButton(Icon icon) {        super(icon);        initAttributes();    }    public DateButton(String text, Icon icon) {        super(text, icon);        initAttributes();    }    public DateButton(String text) {        super(text);        initAttributes();    }    public DateButton(Action a) {        super(a);        initAttributes();    }    public void initAttributes() {        setRolloverEnabled(true);        setBorder(BorderFactory.createEmptyBorder());        setContentAreaFilled(false);        setFocusPainted(false);        setNormalBackground(new Color(216, 216, 216));        setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));    }    @Override    public void paint(Graphics g) {        Graphics2D g2d = (Graphics2D) g;        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        Paint oldPaint = g2d.getPaint();        if ((getModel().isSelected() || getModel().isPressed()) &amp;&amp; selectedBackground != null) {            g2d.setPaint(selectedBackground);            g2d.fillRect(0, 0, getWidth(), getHeight());        } else if (getNormalBackground() != null) {            g2d.setPaint(getNormalBackground());            g2d.fillRect(0, 0, getWidth(), getHeight());        }        g2d.setPaint(oldPaint);        super.paint(g2d);    }    public void clearDefaultAttribute() {        setNormalBackground(null);    }    @Override    public void setBackground(Color bg) {        super.setBackground(bg);        normalBackground = bg;    }    public Color getNormalBackground() {        return normalBackground;    }    public void setNormalBackground(Color normalBackground) {        super.setBackground(normalBackground);        this.normalBackground = normalBackground;    }    public void setSelectedBackground(Color selectedBackground) {        this.selectedBackground = selectedBackground;    }}

来自:http://my.oschina.net/abian/blog/497331

相关栏目:

用户点评