# JTextField Eingabe verbergen



## aze (15. Jul 2009)

Hi

Wie schaffe ich es,dass in einen JTextField eingegebene Zeichen verborgen bleiben ?

Beispiel: Ich habe ein JTextfield in dem ein Datum steht ,z.b 15.7.09.Durch eine bestimmte Tastenkombination wird das Datum verändert,zb durch "+ 2 d" wird das Datum auf dem 17.7.09 gsetzt.Das funktioniert auch.Ein KeyAdapter "berechnet" das neue Datum und setzt den Text mit "setText(...)" neu.Allerdings sieht man dann immer noch das d an dem Datum kleben.Die Anzeige ist "17.7.09d".
getText() gibt jedoch "17.7.09" aus.Um das zu verhindern möchte ich nun das bestimmte zeichenkombinationen im JTextfield wie eben das genannte "+ 2 d" nicht angezeigt werden.Wie mache ich das ?

Schöne Grüße

aze


----------



## Gast2 (15. Jul 2009)

keinen KeyAdapter nehmen sondern einen DocoumentenListener Bsp siehst du in der FAQ.


----------



## André Uhres (15. Jul 2009)

Versuch's mal mit einem eigenen Document. Beispiel:

```
...
public class NewJFrame extends JFrame {
...
        jTextField1.setDocument(new MyDocument());
...
    class MyDocument extends PlainDocument {

        private boolean special;
        private String specialString;

        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            if (str.equals("+")) {
                special = true;
                specialString = "";
            }
            if (!special) {
                super.insertString(offs, str, a);
            } else {
                specialString += str;
            }
            if (special && str.equals("d")) {
                special = false;
                update(jTextField1, specialString); 
            }

        }
        private void update(JTextField tf, String code){
            //TODO
            System.out.println(code);
        }
    }
}
```


----------



## aze (15. Jul 2009)

Ich hab jetz meine eigene document Klasse geschrieben :


```
public class  CharcterDocument extends PlainDocument
	{
		
		
		private static final long serialVersionUID = -68370924938455019L;

		
		
		
		@Override
		public void insertString(int offs, String str, AttributeSet a) throws BadLocationException 
		{	
			
			
			if(str.equals("."))
				super.insertString(offs, str, a);
			
			try 
			{
				Integer.parseInt(str);
			}
			catch (Exception ex)
			{
				return ;
			}
			
			super.insertString(offs, str, a);
			
		}
```

Und sie dann dem Textfield hinzugefügt mit :

textField.setDocument( new CharcterDocument());

Das TextField bleibt darufhin jedoch leer 

Selbst wenn ich dies schreibe passiert der gleiche Effekt:


```
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException 
		{super(offs,str,a)};
```

Was mach ich falsch ?


----------



## Ebenius (15. Jul 2009)

aze hat gesagt.:


> Selbst wenn ich dies schreibe passiert der gleiche Effekt:
> 
> 
> ```
> ...


Glaub ich nicht. Dieser Code ist nicht kompilierbar.

Ebenius


----------



## aze (15. Jul 2009)

Upps,ich meinte ja super.insertString(offs,str,a) nicht den Konstruktor


----------



## aze (15. Jul 2009)

Ich hatte vergessen zu erwähnen ,dass mein JTextField zu einen JSpinner gehört.Bei einen reinen JTextField funktioniert es.Nur bei einen JTextField eines JSpinners nicht


----------



## Ebenius (15. Jul 2009)

aze hat gesagt.:


> Upps,ich meinte ja super.insertString(offs,str,a) nicht den Konstruktor


Und das Semikolon muss vor die geschweifte Klammer. 



aze hat gesagt.:


> Ich hatte vergessen zu erwähnen ,dass mein JTextField zu einen JSpinner gehört.Bei einen reinen JTextField funktioniert es.Nur bei einen JTextField eines JSpinners nicht


Ach doch eine Kleinigkeit vergessen?  Ist auch kein JTextField, sondern ein JFormattedTextField.

Du könntest es so lösen: 
	
	
	
	





```
final JSpinner spinner = new JSpinner(new SpinnerDateModel());
final DateEditor editor = (JSpinner.DateEditor) spinner.getEditor();
final JFormattedTextField tf = editor.getTextField();

final InputMap im = tf.getInputMap();
im.put(KeyStroke.getKeyStroke('+'), "startModulation");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false),
      "stopModulation");
final ActionMap am = tf.getActionMap();

am.put("startModulation", new AbstractAction() {

  public void actionPerformed(ActionEvent e) {
    final JComponent src = (JComponent) e.getSource();
    src.putClientProperty("modulation", Boolean.TRUE);
  }
});
am.put("stopModulation", new AbstractAction() {

  public void actionPerformed(ActionEvent e) {
      // TODO: process recorded modulation sequence
    final JComponent src = (JComponent) e.getSource();
    src.putClientProperty("modulation", Boolean.FALSE);
  }
});

tf.addKeyListener(new KeyAdapter() {

  @Override
  public void keyTyped(KeyEvent e) {
    final JComponent c = (JComponent) e.getSource();
    if (Boolean.TRUE.equals(c.getClientProperty("modulation"))
          && e.getKeyChar() != 0) {
      // TODO: record modulation sequence
      e.consume();
    }
    super.keyPressed(e);
  }
});
```
Bei den beiden TODOs musst Du noch arbeiten. Das zweite TODO sollte die abgefangenen Events auswerten und aufzeichen, das erste TODO sollte dann die jeweilige Aktion ausführen. In diesem Fall beendet sich der Modulationsmodus mit Druck auf ENTER. Wenn Du das anders willst, musst Du's ggf. ändern; ist nur ein Test gewesen.

Hilft Dir das?

Ebenius


----------



## André Uhres (15. Jul 2009)

aze hat gesagt.:


> Ich hatte vergessen zu erwähnen ,dass mein JTextField zu einen JSpinner gehört.


:bahnhof:


----------



## aze (17. Jul 2009)

Ich hab jetzt einen anderen Anstz gefunden ,aber totzdem noch ein Problem.

Ich benutze einen MaskFormatter.Der funktioniert auch ganz gut.Leider ergibt sich folgendes Problem:

Ich erstelle ein jFormattedTextField:


```
_eingabe = new JFormattedTextField( new DateFormatter(DateFormat.getDateInstance (DateFormat.SHORT, Locale.GERMAN)))
```

und installiere dann einen MaskFormatter :


```
try 
		  {
			new MaskFormatter("##.##.##").install(_eingabe);
		  } 
		  catch (ParseException e)
		  {
			
			e.printStackTrace();
		  }
```

Der MaskFormatter sorgt dafür ,dass der Benutzer keinen Mist eingeben kann und das FormattedTextField dafür ,dass das Datum auch stimmt.Allerdings klappt das nur einmal  .Nach der ersten Korrektur funktioniert der MaskFormatter nicht mehr.


----------



## Ebenius (17. Jul 2009)

Unglaublich, Du gehst ja nichtmal auf meinen Lösungsvorschlag ein.

Bzgl. Zeile 3: Das macht man nicht. Man setzt dem JFormattedTextField den Formatter (oder eine FormatterFactory): [java=3]_eingabe.setFormatter(new MaskFormatter("##.##.##"));[/code]
Ebenius


----------



## aze (17. Jul 2009)

Doch ,das hab ich auch versucht ,aber das hat nicht funktioniert.

Ich hab den MaskFormatter erst auch so gesetzt ,aber das hat dann nicht den Effekt den ich haben möchte,nämlich das bei der Eingabe der MaskFormatter guckt ob keine Buchstaben eingegeben werden und beim Verlassen der Eingabe das TextFormattedField überpüft ob die Eingabe stimmt und gegebenfalls korrigiert.


----------



## Ebenius (17. Jul 2009)

1. Ganz sicher funktioniert der Code oben. In eine [c]main()[/c]-Methode kopieren, ausführen, läuft.

2. Das was Du oben machst kann aber nicht funktionieren. Du willst zwei Formatter auf einem JFormattedTextField benutzen. Das kann aber nur mit einem spielen. Bau Dir einen Formatter, der auf die beiden anderen weiterleitet und installiere in so, wie ich zwei Posts weiter oben geschrieben habe.

Ebenius


----------



## aze (17. Jul 2009)

Ebenius hat gesagt.:


> 1. Ganz sicher funktioniert der Code oben. In eine [c]main()[/c]-Methode kopieren, ausführen, läuft.



Hmm,hab ich wohl was falsch gemacht ,sorry.



Ebenius hat gesagt.:


> 2. Das was Du oben machst kann aber nicht funktionieren. Du willst zwei Formatter auf einem JFormattedTextField benutzen. Das kann aber nur mit einem spielen. Bau Dir einen Formatter, der auf die beiden anderen weiterleitet und installiere in so, wie ich zwei Posts weiter oben geschrieben habe.
> 
> Ebenius



Wie meinst du das ? Was meinst du mit weiterleiten ? Installieren durch setFormatter ?


----------



## Ebenius (17. Jul 2009)

aze hat gesagt.:


> Wie meinst du das ? Was meinst du mit weiterleiten ? Installieren durch setFormatter ?


Nein. Durch diese Zeile installierst Du den DateFormatter: 
	
	
	
	





```
new JFormattedTextField( new DateFormatter(DateFormat.getDateInstance (DateFormat.SHORT, Locale.GERMAN)))
```
Damit hat das JFormattedTextField *einen* Formatter, mehr kann es nicht. Wenn Du zwei Formatter brauchst, dann musst Du wohl oder übel selber einen schreiben, der an die beiden anderen delegiert.

Wie auch immer, dieser Weg wird wahrscheinlich nicht sehr weit führen. Die JFormattedTextField-Klasse ist dafür da, mit *einem* Formatter String <=> Value-Konvertierung durchzuführen. Wenn Dir die Standards nicht ausreichen, dann schreib Dir einen eigenen Konverter, der Deinen Ansprüchen genügt.

Wenn Du noch immer nur Zeichen nicht ins Dokument lassen möchtest, weil sie nur Kontrollsequenzen sind, ist mein Lösungsansatz oben eher der richtige.

Ebenius


----------

