说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

有没有像vb里的日历控件一样的东东?

编辑:说三道四文库 发布时间:2018-07-19 11:27
HTML文档下载 WORD文档下载 PDF文档下载
让用户输入年月日太麻烦了,希望能给用户显示一个日历,让用户点一下就ok。
有这样的控件嘛? 哪里有? 如何用?
JAVA里没有这样的控件。

但是JAVASCIPT的应该有。
javascript 里也是调用的windows的系统组件
但是现在做的 j2se 程序要求跨平台,不可能用 windows 的控件。
Calendar对象可以满足你的要求,担不是控件形式
自己用JAVASCRIPT和DHTML写控件,针对IE和NETSCAPE就跨平台了。
因为你说的是客户端控件,不是服务器组件,而且用户输入也不在服务器上。
//////////////////////////////////////////////////////////////
// DateComboBox.java
//////////////////////////////////////////////////////////////

import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;
import java.text.SimpleDateFormat;

import javax.swing.*;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.EmptyBorder;

import com.sun.java.swing.plaf.motif.MotifComboBoxUI;
import com.sun.java.swing.plaf.windows.WindowsComboBoxUI;

import com.iaworld.gui.window.text.DateFormatDocument;
import javax.swing.JTextField;

//////////////////////////////////////////////////////////////
public class DateComboBox
    extends JComboBox
{

    protected SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    public DateComboBox()
    {
        this.setEditable(true);
        JTextField textField = ((JTextField)this.getEditor().getEditorComponent());
        textField.setDocument(new DateFormatDocument());
        textField.addKeyListener(new KeyAdapter()
        {
            public void keyReleased(KeyEvent e)
            {
                if (e.getKeyCode() == KeyEvent.VK_ENTER)
                {
                    textFieldTransferFocus();
                }
            }
        });
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
        setSelectedItem(sdf.format(new java.util.Date()));
    }

    public void textFieldTransferFocus()
    {
        ((JTextField)this.getEditor().getEditorComponent()).transferFocus();
    }

    public void setDateFormat(SimpleDateFormat dateFormat)
    {
        this.dateFormat = dateFormat;
    }

    public void setSelectedItem(Object item)
    {
        // Could put extra logic here or in renderer when item is instanceof Date, Calendar, or String
        // Dont keep a list ... just the currently selected item
        removeAllItems(); // hides the popup if visible
        addItem(item);
        super.setSelectedItem(item);
    }

    public void updateUI()
    {
        ComboBoxUI cui = (ComboBoxUI) UIManager.getUI(this);
        if (cui instanceof MetalComboBoxUI)
        {
            cui = new MetalDateComboBoxUI();
        }
        else if (cui instanceof MotifComboBoxUI)
        {
            cui = new MotifDateComboBoxUI();
        }
        else if (cui instanceof WindowsComboBoxUI)
        {
            cui = new WindowsDateComboBoxUI();
        }
        setUI(cui);
    }

    // UI Inner classes -- one for each supported Look and Feel
    class MetalDateComboBoxUI
        extends MetalComboBoxUI
    {
        protected ComboPopup createPopup()
        {
            return new DatePopup(comboBox);
        }
    }

    class WindowsDateComboBoxUI
        extends WindowsComboBoxUI
    {
        protected ComboPopup createPopup()
        {
            return new DatePopup(comboBox);
        }
    }

    class MotifDateComboBoxUI
        extends MotifComboBoxUI
    {
        protected ComboPopup createPopup()
        {
            return new DatePopup(comboBox);
        }
    }

    // DatePopup inner class
    class DatePopup
        implements ComboPopup, MouseMotionListener,
        MouseListener, KeyListener, PopupMenuListener
    {

        protected JComboBox comboBox;
        protected Calendar calendar;
        protected JPopupMenu popup;
        protected JLabel monthLabel;
        protected JPanel days = null;
        protected SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM");

        protected Color selectedBackground;
        protected Color selectedForeground;
        protected Color background;
        protected Color foreground;

        public DatePopup(JComboBox comboBox)
        {
            this.comboBox = comboBox;
            calendar = Calendar.getInstance();
            // check Look and Feel
            background = UIManager.getColor("ComboBox.background");
            foreground = UIManager.getColor("ComboBox.foreground");
            selectedBackground = UIManager.getColor(
                "ComboBox.selectionBackground");
            selectedForeground = UIManager.getColor(
                "ComboBox.selectionForeground");

            initializePopup();
        }

        //========================================
        // begin ComboPopup method implementations
        //
        public void show()
        {
            try
            {
                // if setSelectedItem() was called with a valid date, adjust the calendar
                calendar.setTime(dateFormat.parse(comboBox.getSelectedItem().
                                                  toString()));
            }
            catch (Exception e)
            {}
            updatePopup();
            popup.show(comboBox, 0, comboBox.getHeight());
        }

        public void hide()
        {
            popup.setVisible(false);
        }

        protected JList list = new JList();
        public JList getList()
        {
            return list;
        }

        public MouseListener getMouseListener()
        {
            return this;
        }

        public MouseMotionListener getMouseMotionListener()
        {
            return this;
        }

        public KeyListener getKeyListener()
        {
            return this;
        }

        public boolean isVisible()
        {
            return popup.isVisible();
        }

        public void uninstallingUI()
        {
            popup.removePopupMenuListener(this);
        }

        // end ComboPopup method implementations

        // begin Event Listeners
        // MouseListener

        public void mousePressed(MouseEvent e)
        {}

        public void mouseReleased(MouseEvent e)
        {}

        // something else registered for MousePressed
        public void mouseClicked(MouseEvent e)
        {
            if (!SwingUtilities.isLeftMouseButton(e))
                return;
            if (!comboBox.isEnabled())
                return;
            if (comboBox.isEditable())
            {
                comboBox.getEditor().getEditorComponent().requestFocus();
            }
            else
            {
                comboBox.requestFocus();
            }
            togglePopup();
        }
protected boolean mouseInside = false;
        public void mouseEntered(MouseEvent e)
        {
            mouseInside = true;
        }

        public void mouseExited(MouseEvent e)
        {
            mouseInside = false;
        }

        // MouseMotionListener
        public void mouseDragged(MouseEvent e)
        {}

        public void mouseMoved(MouseEvent e)
        {}

        // KeyListener
        public void keyPressed(KeyEvent e)
        {}

        public void keyTyped(KeyEvent e)
        {}

        public void keyReleased(KeyEvent e)
        {
            if (e.getKeyCode() == KeyEvent.VK_SPACE ||
                e.getKeyCode() == KeyEvent.VK_ENTER)
            {
                togglePopup();
            }
        }

        /**
         * Variables hideNext and mouseInside are used to
         * hide the popupMenu by clicking the mouse in the JComboBox
         */
        public void popupMenuCanceled(PopupMenuEvent e)
        {}

        protected boolean hideNext = false;
        public void popupMenuWillBecomeInvisible(PopupMenuEvent e)
        {
            hideNext = mouseInside;
        }

        public void popupMenuWillBecomeVisible(PopupMenuEvent e)
        {}

        //
        // end Event Listeners
        //=================================================================

        //===================================================================
        // begin Utility methods
        //

        protected void togglePopup()
        {
            if (isVisible() || hideNext)
            {
                hide();
            }
            else
            {
                show();
            }
            hideNext = false;
        }

        //
        // end Utility methods
        //=================================================================

        // Note *** did not use JButton because Popup closes when pressed
        protected JLabel createUpdateButton(final int field, final int amount)
        {
            final JLabel label = new JLabel();
            final Border selectedBorder = new EtchedBorder();
            final Border unselectedBorder = new EmptyBorder(selectedBorder.
                getBorderInsets(new JLabel()));
            label.setBorder(unselectedBorder);
            label.setForeground(foreground);
            label.addMouseListener(new MouseAdapter()
            {
                public void mouseReleased(MouseEvent e)
                {
                    calendar.add(field, amount);
                    updatePopup();
                }

                public void mouseEntered(MouseEvent e)
                {
                    label.setBorder(selectedBorder);
                }

                public void mouseExited(MouseEvent e)
                {
                    label.setBorder(unselectedBorder);
                }
            });
            return label;
        }

        protected void initializePopup()
        {
            JPanel header = new JPanel(); // used Box, but it wasn't Opaque
            header.setLayout(new BoxLayout(header, BoxLayout.X_AXIS));
            header.setBackground(background);
            header.setOpaque(true);

            JLabel label;
            label = createUpdateButton(Calendar.YEAR, -1);
            label.setText("<<");
            label.setToolTipText("PreviousYear");

            header.add(Box.createHorizontalStrut(12));
            header.add(label);
            header.add(Box.createHorizontalStrut(12));

            label = createUpdateButton(Calendar.MONTH, -1);
            label.setText("<");
            label.setToolTipText("PreviousMonth");
            header.add(label);

            monthLabel = new JLabel("", JLabel.CENTER);
            monthLabel.setForeground(foreground);
            header.add(Box.createHorizontalGlue());
            header.add(monthLabel);
            header.add(Box.createHorizontalGlue());

            label = createUpdateButton(Calendar.MONTH, 1);
            label.setText(">");
            label.setToolTipText("NextMonth");
            header.add(label);

            label = createUpdateButton(Calendar.YEAR, 1);
            label.setText(">>");
            label.setToolTipText("NextYear");

            header.add(Box.createHorizontalStrut(12));
            header.add(label);
            header.add(Box.createHorizontalStrut(12));

            popup = new JPopupMenu();
            popup.setBorder(BorderFactory.createLineBorder(Color.black));
            popup.setLayout(new BorderLayout());
            popup.setBackground(background);
            popup.addPopupMenuListener(this);
            popup.add(BorderLayout.NORTH, header);
        }

        // update the Popup when either the month or the year of the calendar has been changed
        protected void updatePopup()
        {
            monthLabel.setText(monthFormat.format(calendar.getTime()));
            if (days != null)
            {
                popup.remove(days);
            }
            days = new JPanel(new GridLayout(0, 7));
            days.setBackground(background);
            days.setOpaque(true);

            Calendar setupCalendar = (Calendar) calendar.clone();
            setupCalendar.set(Calendar.DAY_OF_WEEK,
                              setupCalendar.getFirstDayOfWeek());
            for (int i = 0; i < 7; i++)
            {
                int dayInt = setupCalendar.get(Calendar.DAY_OF_WEEK);
                JLabel label = new JLabel();
                label.setHorizontalAlignment(JLabel.CENTER);
                label.setForeground(foreground);
                if (dayInt == Calendar.SUNDAY)
                {
                    label.setText("Sun");
                }
                else if (dayInt == Calendar.MONDAY)
                {
                    label.setText("Mon");
                }
                else if (dayInt == Calendar.TUESDAY)
                {
                    label.setText("Tue");
                }
                else if (dayInt == Calendar.WEDNESDAY)
                {
                    label.setText("Wed");
                }
                else if (dayInt == Calendar.THURSDAY)
                {
                    label.setText("Thu");
                }
                else if (dayInt == Calendar.FRIDAY)
                {
                    label.setText("Fri");
                }
                else if (dayInt == Calendar.SATURDAY)
                {
                    label.setText("Sat");
                }
                days.add(label);
                setupCalendar.roll(Calendar.DAY_OF_WEEK, true);
            }
用不了这么长吧,用javascipt写一个就行了
setupCalendar = (Calendar) calendar.clone();
            setupCalendar.set(Calendar.DAY_OF_MONTH, 1);
            int first = setupCalendar.get(Calendar.DAY_OF_WEEK);
            for (int i = 0; i < (first - 1); i++)
            {
                days.add(new JLabel(""));
            }
            for (int i = 1;
                 i <= setupCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); i++)
            {
                final int day = i;
                final JLabel label = new JLabel(String.valueOf(day));
                label.setHorizontalAlignment(JLabel.CENTER);
                label.setForeground(foreground);
                label.addMouseListener(new MouseListener()
                {
                    public void mousePressed(MouseEvent e)
                    {}

                    public void mouseClicked(MouseEvent e)
                    {}

                    public void mouseReleased(MouseEvent e)
                    {
                        label.setOpaque(false);
                        label.setBackground(background);
                        label.setForeground(foreground);
                        calendar.set(Calendar.DAY_OF_MONTH, day);
                        comboBox.setSelectedItem(dateFormat.format(calendar.
                            getTime()));
                        hide();
                        // hide is called with setSelectedItem() ... removeAll()
                        comboBox.requestFocus();
                    }

                    public void mouseEntered(MouseEvent e)
                    {
                        label.setOpaque(true);
                        label.setBackground(selectedBackground);
                        label.setForeground(selectedForeground);
                    }

                    public void mouseExited(MouseEvent e)
                    {
                        label.setOpaque(false);
                        label.setBackground(background);
                        label.setForeground(foreground);
                    }
                });

                days.add(label);
            }

            final JLabel label = new JLabel();
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setForeground(foreground);
            label.setText("Today");
            label.addMouseListener(new MouseListener()
            {
                public void mousePressed(MouseEvent e)
                {}

                public void mouseClicked(MouseEvent e)
                {}

                public void mouseReleased(MouseEvent e)
                {
                    label.setOpaque(false);
                    label.setBackground(background);
                    label.setForeground(foreground);
                    calendar = Calendar.getInstance();
                    comboBox.setSelectedItem(dateFormat.format(calendar.
                        getTime()));
                    hide();
                    // hide is called with setSelectedItem() ... removeAll()
                    comboBox.requestFocus();
                }

                public void mouseEntered(MouseEvent e)
                {
                    label.setOpaque(true);
                    label.setBackground(selectedBackground);
                    label.setForeground(selectedForeground);
                }

                public void mouseExited(MouseEvent e)
                {
                    label.setOpaque(false);
                    label.setBackground(background);
                    label.setForeground(foreground);
                }
            });
            popup.add(BorderLayout.SOUTH,label);

            popup.add(BorderLayout.CENTER, days);
            popup.pack();
        }
    }
    /**
        //////////////////////////////////////////////////////////////
        // This is only included to provide a sample GUI
        //////////////////////////////////////////////////////////////
        public static void main(String args[]) {
     JFrame f = new JFrame();
     Container c = f.getContentPane();
     c.setLayout(new FlowLayout());
     c.add(new JLabel("Date 1:"));
     c.add(new DateComboBox());
     c.add(new JLabel("Date 2:"));
     DateComboBox dcb = new DateComboBox();
     dcb.setEditable(true);
     c.add(dcb);
     f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
          System.exit(0);
      }
         });
     f.setSize(500, 200);
     f.show();
        }
     */
}
这是Swing用的,写页面当然就不用了。
谢谢 很好用。
只可惜我没有这个包
import com.iaworld.gui.window.text.DateFormatDocument;
但是把这个行和下面的 textField.setDocument(new DateFormatDocument());
两行注释掉以后可以正常用。

但是偶尔会出现好几个today选项,不知道是为什么。
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘