# JFormattedTextField



## RalphW (1. Apr 2009)

Hi * 

habe ein kleines CalendarWidget das ein JFormattedTextField benutzt. 
Beim initialen Anzeigen setze ich das field auf NULL. 
Geht der User hin und tippt ein Wert ein, so wird ein gültiger Datumswert gesetzt. Soll auch so sein. 
Ich möchte nun aber auch die Möglichkeit bieten, dass auch der Datumswert wieder gelöscht werden kann.  Finde aber derzeit keine Lösung dafür. 

Hier mal ein kleines Demo 
[HIGHLIGHT="Java"]import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.DateFormatter;

public class JFormattedTF 
{
  JFormattedTextField field = null;

  public JFormattedTF() 
  {
    this.run();
  }
  public static void main(String args[]) 
  {
    JFormattedTF tf = new JFormattedTF();
    tf.run();
  }
  public void run()
  {
    DateFormatter formatter = new DateFormatter(DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()));
    field = new JFormattedTextField(formatter);
    field.setValue(null);
    field.setPreferredSize(new Dimension(90,20));
    JTextField field1 = new JTextField(20);
    JPanel center = new JPanel( new FlowLayout(FlowLayout.LEFT) );
    center.add(new JLabel("JFormattedTextField:"));
    center.add(field,BorderLayout.CENTER);
    center.add(new JLabel("JTextField:"));
    center.add(field1);
    JPanel content = new JPanel( new FlowLayout(FlowLayout.LEFT) );
    content.add( center, BorderLayout.SOUTH );
    JFrame frame = new JFrame("Test program");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(content);
    frame.setSize(550,100);
    frame.setVisible(true);
  } 
}[/HIGHLIGHT]
Was ist zu tun (welches Event) damit der Úser das Datum auch  wieder löschen kann. 

Many thanx 

Grüsse 
Ralph


----------



## Gast2 (1. Apr 2009)

Das musst du ja entscheiden wann er es wieder löschen kann???
Durch ein Button?Wenn er wieder ins Feld hineinklickt???
Durch die DEL Taste???


----------



## RalphW (1. Apr 2009)

SirWayne hat gesagt.:


> Das musst du ja entscheiden wann er es wieder löschen kann???
> Durch ein Button?Wenn er wieder ins Feld hineinklickt???
> Durch die DEL Taste???



Ins Feld rein, markieren, Del-Taste.


----------



## Gast2 (1. Apr 2009)

ins feld rein focuslistener


----------



## RalphW (1. Apr 2009)

SirWayne hat gesagt.:


> ins feld rein focuslistener



o.k hab ein focusLost probiert 
<code>
field.addFocusListener(new java.awt.event.FocusAdapter()
    {
      public void focusLost(FocusEvent e)
      {
        //dosomething
      }
    });
</code>

aber wie unterscheide ich jetzt ob der User den Wert gelöscht hat ? 
umd dann field.setValue(null) su setzen.


----------



## Gast2 (1. Apr 2009)

1. schon mal aufgefallen, dass dein programm 2 mal startet????
2. DEL und ENTF und makieren überschreiben tut doch alles was dein problem genau??
3. du brauchst focus gained wenn er in feld rein geht dann löschen... was ich aber unpraktisch find da wenn er nur eine zahle ändern will er ein komplett neues datum eingeben muss


----------



## Ebenius (1. Apr 2009)

Du musst dazu den DateFormatter erweitern, so, dass er leere _Strings_ in _null_ parsen kann und _null_ zum leeren _String_ formatiert.

[HIGHLIGHT="Java"]/* $Id: NullableDateFormatter.java,v 1.1 2009/04/01 09:44:53 ebenius Exp $ */

/* Copyright 2009 Sebastian Haufe

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius.widget.text;

import java.text.DateFormat;
import java.text.ParseException;

import javax.swing.text.DateFormatter;

/**
 * An enhanced date formatter, parsing {@code null} text and empty strings to
 * {@code null} values, and formatting {@code null} values to empty string.
 * 
 * @version $Revision: 1.1 $ as of $Date: 2009/04/01 09:44:53 $
 * @author Sebastian Haufe
 */
public class NullableDateFormatter extends DateFormatter {

  /** Serial version UID */
  private static final long serialVersionUID = 7115438228459260264L;

  // -------------------------------------------------------------------------
  // Constructors
  // -------------------------------------------------------------------------

  /**
   * Creates a new {@code NullableDateFormatter} with the given date format.
   * 
   * @param format the date format used
   * @see DateFormatter#DateFormatter(java.text.DateFormat)
   */
  public NullableDateFormatter(DateFormat format) {
    super(format);
  }

  // -------------------------------------------------------------------------
  // Overridden parse and format methods
  // -------------------------------------------------------------------------

  /**
   * If the input argument is {@code null} or an empty string, returns {@code
   * null}. Otherwise delegates to the standard parse method
   * {@link DateFormatter#stringToValue(String)}.
   */
  @Override
  public Object stringToValue(String text) throws ParseException {
    return text == null || text.length() == 0 ? null : super
          .stringToValue(text);
  }

  /**
   * If the input argument is {@code null} returns an empty string. Otherwise
   * delegates to the standard format method
   * {@link DateFormatter#valueToString(Object)}
   */
  @Override
  public String valueToString(Object value) throws ParseException {
    return value == null ? "" : super.valueToString(value); //$NON-NLS-1$
  }
}[/HIGHLIGHT]
Ebenius


----------



## RalphW (1. Apr 2009)

Ebenius hat gesagt.:


> Du musst dazu den DateFormatter erweitern, so, dass er leere _Strings_ in _null_ parsen kann und _null_ zum leeren _String_ formatiert.
> 
> Das ist DIE Lösung.
> 
> ...


----------



## Ebenius (1. Apr 2009)

RalphW hat gesagt.:


> Das ist DIE Lösung.


Wir sprechen uns nochmal, wenn Du JSpinner benutzen willst. Da ist das dann nur *ein Teil* (Viertel bis Zehntel) der Lösung. Da hat Sun mit den Default-Implementierungen meiner Meinung nach gepennt.

Ebenius


----------

