【问题标题】:Dynamic JFormattedTextFields in JXDatePickerJXDatePicker 中的动态 JFormattedTextFields
【发布时间】:2012-10-01 11:43:22
【问题描述】:

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

所以为了简化 UI 以拥有一个单一的文本字段,我创建了一个 JXDatePickerJFormattedTextfield 作为它的编辑器,并动态分配 JFormattedTextfield 的格式化工厂来处理 IntegerFloatStringDate 输入。以下是实现的代码sn-p:

  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)

当字段是数字格式时,有没有办法阻止日期选择器尝试将值转换为日期?还是有其他解决方法?

【问题讨论】:

  • 不太明白您要达到的目标 - JXDatePicker 旨在处理日期,仅此而已:-)
  • 澄清您想要一个能够处理ints、floats、dates 和strings 的JFormattedTextField?
  • 你怎么知道整数和浮点数的区别?除了检查输入是否有.
  • @DavidKroukamp 是的,当它是一个日期时,用户界面将需要提供一个日期选择器。要格式化的类型由过去的用户操作来区分,所以当用户输入值时,我应该已经知道它应该是什么格式。
  • 如果你事先知道你想接收什么样的输入,为什么不简单地替换输入字段而不是尝试制作一个可以处理任何事情的字段?

标签: java swing datepicker swingx jformattedtextfield


【解决方案1】:
  • 从未使用过JXDatePicker(我认为只支持通过DateFormat或SimpleDateFormat格式化Date value,必须同步两个格式化程序),

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

  • 也许看看JCalendar by Kai Toedter,并使用codesource

【讨论】:

  • JXDatePicker 在项目的其他地方使用,因此为了保持 UI 一致,我将不得不使用它。微调器将用于处理日期,但我不确定如何将它用于字符串..
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多