1

integerfloat、の 4 種類の形式を受け入れるフィールドが必要stringですdate。ユーザーが日付入力を要求すると、UI は日付ピッカーを表示します。

そのため、UI を単純化して単一のテキスト フィールドを作成するために、エディタとして を作成し、 のフォーマット済みファクトリをJXDatePicker、、および入力を処理するように動的に割り当てます。以下は、実装のコード スニペットです。JFormattedTextfieldJFormattedTextfieldIntegerFloatStringDate

  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)

フィールドが数値形式の場合、日付ピッカーが値を日付にキャストしようとするのを止める方法はありますか? または別の回避策がありますか?

4

1 に答える 1

1
  • 使用されたことはありませんJXDatePicker(DateFormatまたはSimpleDateFormatによってフォーマットされたもののみをサポートしていると思います。Date value両方のフォーマッターを同期する必要があります)、

  • JSpinnerSpinnerDateModel代わりに使用できますJFormattedTextField

  • たぶん、Kai Toedterの JCalendar を見て、codesource を使用してください。

于 2012-10-01T11:53:24.780 に答える