Java JXDatePicker中的动态JFormattedTextFields

Java JXDatePicker中的动态JFormattedTextFields,java,swing,datepicker,swingx,jformattedtextfield,Java,Swing,Datepicker,Swingx,Jformattedtextfield,我需要一个接受4种格式的字段:integer、float、string和date。当用户需要输入日期时,UI将显示一个日期选择器 因此,为了简化UI,使其具有单个文本字段,我创建了一个JXDatePicker,将JFormattedTextfield作为编辑器,并动态分配JFormattedTextfield的格式化工厂来处理整数、浮点、字符串和日期输入。以下是实现的代码片段: public void setFormat(String format) { // requires

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

因此,为了简化UI,使其具有单个文本字段,我创建了一个
JXDatePicker
,将
JFormattedTextfield
作为编辑器,并动态分配
JFormattedTextfield
的格式化工厂来处理
整数
浮点
字符串
日期
输入。以下是实现的代码片段:

  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似乎试图将其转换为日期数据类型,因此导致类转换异常:

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)
当字段为数字格式时,是否有方法阻止日期选择器尝试将值转换为日期?或者还有其他工作吗?

  • 从未使用过
    JXDatePicker
    (我认为只支持按DateFormat或SimpleDateFormat格式化的
    日期值,必须同步两个格式化程序)

  • 您可以将
    JSpinner
    SpinnerDateModel
    一起使用,而不是
    JFormattedTextField

  • 可能有看,并使用代码源

      • 从未使用过
        JXDatePicker
        (我认为只支持按DateFormat或SimpleDateFormat格式化的
        日期值,必须同步两个格式化程序)

      • 您可以将
        JSpinner
        SpinnerDateModel
        一起使用,而不是
        JFormattedTextField

      • 可能有看,并使用代码源


      不太了解您想要实现的目标-JXDatePicker设计用于处理日期,不少于也不多于:-)分类您想要一个能够处理
      int
      s的JFormattedTextField,
      float
      s
      date
      s和
      string
      s?您如何知道整数和float之间的区别?除了检查输入是否有
      @DavidKroukamp yes以及何时是日期之外,UI将需要提供一个日期选择器。要格式化的类型由过去的用户操作来区分,因此当用户输入值时,我应该已经知道它应该是什么格式。如果您提前知道希望接收什么类型的输入,为什么不简单地替换输入字段,而不是尝试创建一个可以处理任何事情的字段呢?我不太明白您想要实现的是什么-JXDatePicker设计用于处理日期,不多也不少:-)为了分类,您需要一个能够处理
      int
      s的JFormattedTextField,
      float
      s
      date
      s和
      string
      s?您如何知道整数和float之间的区别?除了检查输入是否有
      @DavidKroukamp yes以及何时是日期之外,UI将需要提供一个日期选择器。要格式化的类型由过去的用户操作来区分,因此当用户输入值时,我应该已经知道它应该是什么格式。如果您提前知道希望接收什么类型的输入,为什么不简单地替换输入字段,而不是尝试创建一个可以处理任何事情的字段呢?JXDatePicker在项目的其他地方使用,所以为了保持UI的一致性,我必须使用它。微调器将用于处理日期,但我不确定如何将其用于字符串。JXDatePicker在项目的其他地方使用,因此为了保持UI的一致性,我必须使用它。微调器将用于处理日期,但我不确定如何将其用于字符串。。