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

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

编辑:说三道四文库 发布时间:2017-12-15 09:03
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选项,不知道是为什么。
对抗苹果?豪雅联合Google、Intel开发智能奢表 VR产品技术解析之三星Gear VR 雅虎北研即将关闭 人才抢夺战迅速拉响 移动应用中的AR开发,5款最受欢迎工具推荐! 中国黑客Pwn2Own再创佳绩 Keen Team三年五夺魁 星环CTO孙元浩:技术解析Transwarp Inceptor是怎样炼成的 第七届中国云计算大会将于6月3-5日在北京召开 两大设计模式 塑造高可读性的网页布局 IP争夺战:任天堂与DeNA联手意味着什么? UNITE 2015干货不断,三天日程抢先看! iOS 8发布近一年,苹果HomeKit都带来了什么? Facebook开源移动网络测试工具Augmented Traffic Control 用JavaScript开发移动原生应用,Facebook正式开源React Native! 《知性》,探寻移动化社区的敏感带 【程序员电子刊精选】技术人员如何参与产品设计讨论之激活那一潭死水 Google开源代码构建工具Bazel 长点心吧!为啥健身应用让你越减越肥? 微信公众号能删除单篇文章了 安卓Android手机应用开发入门书籍推荐 自动释放内存!Facebook推出强大Android图片库Fresco 《近匠》AR学校:从教育领域看增强现实机遇何在 专访Mellanox CEO Eyal Waldman:InfiniBand与以太网齐驱并进 性能更胜一筹 IM助你打造千万级App——容联•云通讯线下沙龙 乐视智能硬件再发力,超级自行车今发布 专访格灵深瞳CTO赵勇:为&amp;quot; 计算机视觉&amp;quot; 赋予智慧的光芒 【程序员电子刊精选】水火不容?研发人员也是产品经理! 如何打动用户?携程用户体验实践分享 【征文】Java二十周年特别策划——谈谈我与Java的那些年、这些事 Facebook的愿景以及虚拟现实的未来 iBeacons一年回顾 英特尔中国30周年之际 IDF上你需要了解的5件事 原来asp中的recordset 在.net中还能用吗 “参数不足,期待是1”是什么意思? 如何读取一个文本文件的最后一行 将一表中的所有A列和B列的值(varchar型)合并后,添加到C列中。这个SQL语句怎么写? 请教用公式urlopen如何在“另一窗口“打开一页面。 win2000下如何给程序指定program ID 急,急,在VC中如何.sql文件(ORACLE) 我的DW不能启动了,问题解决马上给分100! 高手请进,在线等待! 下了一个手机游戏(JAR、JAD),想在计算机上模拟运行一下,该怎么做? 使用 应用程序组装工具 创建.ear,创建.war 在WAS中安装出现错误 !!! 立即给分 怎样改变由 javaw 打开的*.jar文件的图标? 纯粹好奇~水园、昨天晚上发生了什么? 为什么修改httpd.conf后,APACHE服务不能启动? 想买两本书,请看过该书的朋友评价一下,特别是书里的代码是C#的还是VB.NET的? win2000注册表问题 什么时候需要定义过程??? 兄弟们,替我出口气 800*600分辨率下,toolbar显示不完整,请问该如何解决?(100分) 我想在数据窗口中显示年龄信息,但是出错了!! 各位大侠,兄弟很急得问题,80分奉送 [ 新手 ] 请问几个关于时间的SQL语句 用ROUND函数,需要包含哪个头文件? 高手请进,在线等待!!! 怎么样用HTML代码实现在一个.htm文件中加载另一个.htm文件 ??? 哪位大哥有能解析ANS.1语言的东西? 比较大小的简单问题? 用Ras拨号过程中,如何取消拨号? 大家看看合适否? 怎样以逗号为标记分段读取内容? 求救:本地计算机无法启动 oracleserviceoradb 服务! java和.net你们好吗?保重VC。 如何把XML文件导到oracle数据库中? 变量初值问题,高手请进 求通过手机号码判断出手机入网地址(如上海,江苏等)的java接口 如何把htm文件移植到VB.NET中. 妈的找了几天广告交换的网站,怎么全是色情的,正常的网站就没有吗?你们的网站放不放这些东西 。 键盘错乱 高人指点 从.net想到php(欢迎大家讨论) WebService 连接问题????????????????????????????? 如何判断用户是否安装pdf格式阅读器 有什么好办法破解论坛的密码? 一个高难度的问题。100分求教!!! 构建EXCEL后,写入数据为何报错,请邦我看看 DELPHI与ORACLE9I中的BLOB字段存取的问题 怎么关闭窗口? 关于读取图片的问题! 打印口的传输时序是如何定义的 我要在数据窗口中实现出货日期在20天之内的记录的字体颜色为红色,font.color的expression该怎么写?在线等待!!! 请问怎么安装statspack? 如何从整形数字字符串得到相应的整形数字? 求“冷月无声”的反义词 冷月无声的反义词 一定要正确,11题的第五小题、12、13题 如果你把快乐告诉一个朋友,你将得到两个快乐,如果你把忧愁向一个朋友倾诉,你将被分掉一半忧愁 一个半圆,ABCD都在半圆上,AB为直径,AD与BC交于圆内P点,∠DPB=α问CD/AB=?(sinα cosα…… 如果你把快乐告诉一个朋友,你将得到两个快乐;而如果你把忧愁向一个朋友倾吐,你将;被分掉一半忧愁.的作文?如果你把快乐告诉一个朋友,你将得到两个快乐;而如果你把忧愁向一个朋友倾吐, 关于利息,本人08年存哪了四万元,存期一年,当时的年利息是4.14000,到期时没有取出来.现在是2011年,打算取出来,那么利息是按现在的利息算还是按照08年的算啊? 如果你把快乐告诉一个朋友,你将得到两个快乐,而如果你把忧愁向一个朋友倾诉,你将被分掉一半忧愁我要这句话的英文版原句!培根说的. 一个小于1的分数,他的分子和分母相加的和是13,这样的分数一共有几个?分别是哪些数? 篦字去掉竹字头念什么? 求冷月边关的反义词或近义词,意思比较相近的成语也可以,是在不行有些渊源的也可以, 英内阁会议为防监听禁用iPad 高官安倍夫人昭惠拜访熊本县 体验韩式穿越印尼巴厘岛男子咖啡地中发现2000多俄拟为中国在内的20国游客提供3日免刚果(金)政府宣布该国打击反政府武装科索沃举行地方政府选举 投票点遭蒙面鲁哈尼称伊朗对核谈前景不乐观 力求解两家入驻开城园区韩企因经营困难拟出售奥巴马被指政治光环不再 支持率与声望美国务卿克里访埃及 美官员称或恢复对日全日空航班突发漏油事故 羽田机场封组织舰载机起降训练最佳实践20强”称号车贷拟实施最高发放比例要求郑益昕:目前一切顺利世相圈点中国民生银行股份有限公司厦门分行与厦中科大与福州一中共建“基础教育创新基泉州经验做法获国务院办公厅通报表扬公 示郑益昕:目前一切顺利我省跨境电商企业迎利好大国的崛起末世官道之调教丧尸世界香江一九七八洪荒天苍茫夺世十方真宰魅宠征天屠魔令寄生魔王华龙保镖财神来袭兴坪渔村景区旅游嘻哈包袱铺旅游石门河景区旅游渠洋湖旅游靖西鹅泉旅游南楼旅游千灯湖公园旅游东瀑大峡谷旅游满城汉墓旅游总统兵马大元帅府旅游周村大街旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘