【问题标题】:How to set JCalendar date in JDateChooser如何在 JDateChooser 中设置 JCalendar 日期
【发布时间】:2015-03-27 11:55:21
【问题描述】:

我有一个用于选择出生日期的 JDateChooser。它以空日期值开始,让用户使用文本字段或打开 Jcalendar 的 jdatechooser 按钮选择出生日期。

我正在尝试将 JCalendar 的日期设置为从当前日期起 -10 年。默认情况下,JCalendar 将日期设置为当年。我试过这段代码,但它不起作用——它仍然将日期设置为当前日期。任何帮助都可以。谢谢!

    dcBirthDateNew = new JDateChooser();
    dcBirthDateNew.setDateFormatString("MM/dd/yyyy");
    dcBirthDateNew.getDateEditor().getUiComponent().addFocusListener(new FocusAdapter() {
        @Override
        public void focusGained(FocusEvent evt) {
            if (evt.getSource() instanceof JTextComponent) {
                final JTextComponent textComponent=((JTextComponent)evt.getSource());
                SwingUtilities.invokeLater(new Runnable(){
                    public void run() {
                        textComponent.selectAll();
                    }});
            }   
        }
    });
    JCalendar calx = dcBirthDateNew.getJCalendar();
    calx.setCalendar(getPrevDate());

private static Calendar getPrevDate() {
    DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
    Date myDate = new Date(System.currentTimeMillis());
    System.out.println("result is "+ dateFormat.format(myDate));
    Calendar cal = Calendar.getInstance();
    cal.setTime(myDate);
    cal.add(Calendar.YEAR, -10);
    System.out.println(dateFormat.format(cal.getTime()));
    return cal;
}

【问题讨论】:

    标签: java swing jcalendar jdatechooser


    【解决方案1】:

    这似乎工作正常。

    Calendar c = Calendar.getInstance();
    c.add(Calendar.YEAR, -10);
    
    JDateChooser chooser = new JDateChooser(c.getTime());
    this.add(chooser);
    

    附录:弹窗编辑器的日期默认为JDateChooser中的值;如果显式设置,它将成为默认值:

    JDateChooser chooser = new JDateChooser();
    chooser.getDateEditor().setDate(c.getTime());
    

    您可以更新PropertyChangeListener 中的另一个空文本字段,如here 所示;属性名称是"date"

    附录:仔细观察,ActionListenerJDateChooser 实现处理上述默认日期。您可以覆盖它,替换下面显示的行,以创建不同的默认值。

    JDateChooser chooser = new MyDateChooser();
    this.add(chooser);
    …
    private static class MyDateChooser extends JDateChooser {
    
        @Override
        public void actionPerformed(ActionEvent e) {
            …
            Date date = dateEditor.getDate();
            if (date == null) {
                Calendar c = Calendar.getInstance();
                c.add(Calendar.YEAR, -10);
                calendar.setTime(c.getTime());
            } else {
                calendar.setTime(date);
            }
            jcalendar.setCalendar(calendar);
            …
        }
    }
    

    【讨论】:

    • 你好垃圾!我还不能尝试,但从上面的代码和 ss 的外观来看,你有两个独立的组件。我的只有带有弹出 jcalendar 按钮的 jdatechooser。我似乎无法弄清楚如何在文本字段为空的情况下为弹出 jcalendar 设置日期。我试图避免将日期设置为 jchooser,而是在弹出窗口中将其设置为默认值。我的问题有意义吗?
    • 啊,我明白了;我更新了示例以显示带有弹出编辑器的单个组件;我没有看到将字段设为空白但为弹出窗口提供默认值的方法。
    • 您要查找的是最新的附录吗?
    • 嗨垃圾,这就是我要找的。但是,当我尝试您的解决方案时可能错过了一些东西。我认为要使其正常工作,我还需要整个代码才能使弹出窗口正确显示?
    • 对;我不想混合许可证;我在更改前后添加了一行以供参考。
    【解决方案2】:

    也许还有另一种方法可以做到这一点,但这就是我所拥有的:

    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
    int subtractYearValue = 10;
    
    int currentYear = Calendar.getInstance().get(Calendar.YEAR);
    int currentMonth = Calendar.getInstance().get(Calendar.MONTH);
    int currentDate= Calendar.getInstance().get(Calendar.DATE);
    
    calendar.set(currentYear - subtractYearValue , currentMonth , currentDate);
    date.setTime(calendar.getTimeInMillis());
    
    dateChooser.setDate(date);
    

    【讨论】:

    • 我正在寻找一种方法来绕过将日期值放入 jdatechooser 的文本字段组件中,以便 jcalendar 将其日期设置为该值。默认情况下,如果 texfield 为空,我认为 jcalendar 会将其日期设置为当前日期。
    • 好吧,我认为这是不可能的。当 texfield 组件为空或其中的值无法转换为实际日期时,JCalendar 将其日期设置为当前日期。
    • @CristianMarian:使用Calendar 的单个实例;我提出了一种方法here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多