JXDatePicker中的动态JFormattedTextFields

时间:2012-10-01 11:43:23

标签: java swing datepicker swingx jformattedtextfield

我需要一个接受4种格式的字段:integerfloatstringdate。当用户需要输入日期时,UI将显示日期选择器。

为了简化用户界面以获得单一文本字段,我创建了JXDatePicker JFormattedTextfield作为编辑器,并动态分配JFormattedTextfield的格式化工厂来处理IntegerFloatStringDate输入。以下是该实现的代码片段:

  public void setFormat(String format)
  {
    // requires integer format
    if (IntegerAttribute.TYPE_NAME.equals(format)) {
      setBoundFormatFactory(new DefaultFormatterFactory(new NumberFormatter(NumberFormat.getInstance())));
    }
    // requires float format
    else if (FloatAttribute.TYPE_NAME.equals(format)) {
      setBoundFormatFactory(new DefaultFormatterFactory(new NumberFormatter(new DecimalFormat(FLOAT_FORMAT))));
    }
    else if (DateAttribute.TYPE_NAME.equals(format)
            || DateTimeAttribute.TYPE_NAME.equals(format)
            || TimeAttribute.TYPE_NAME.equals(format)) {
      // requires date format
      setDateFormat(model.getDateFormat());
    }
    else {
      // otherwise set to us string
      setBoundFormatFactory(new DefaultFormatterFactory()); 
    }
  }

  public void setDateFormat(String dateFormat)
  {
    setBoundFormatFactory(new DefaultFormatterFactory(new DateFormatter(new SimpleDateFormat(dateFormat))));
  }

  private void setBoundFormatFactory(DefaultFormatterFactory factory)
  {
    m_formattedTextfield.setFormatterFactory(factory);
  }

该实现适用于字符串和日期格式,但对于整数和浮点数,似乎JXDatePicker试图将其转换为Date数据类型,因此会导致类强制转换异常:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Date
at org.jdesktop.swingx.plaf.basic.BasicDatePickerUI$Handler.editorPropertyChange(BasicDatePickerUI.java:1359)
at org.jdesktop.swingx.plaf.basic.BasicDatePickerUI$Handler.propertyChange(BasicDatePickerUI.java:1336)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
at java.awt.Component.firePropertyChange(Component.java:8163)
at javax.swing.JFormattedTextField.setValue(JFormattedTextField.java:782)
at javax.swing.JFormattedTextField.commitEdit(JFormattedTextField.java:513)

有没有办法阻止日期选择器尝试将值转换为字段为数字格式的日期?或者还有其他工作吗?

1 个答案:

答案 0 :(得分:1)

  • 从未使用过JXDatePicker(我认为只支持由DateFormat或SimpleDateFormat格式化Date value,必须同步两个格式化程序),

  • 您可以JSpinner使用SpinnerDateModel代替JFormattedTextField

  • 可能会查看JCalendar by Kai Toedter,并使用codesource