JTextField Eingabe verbergen

Status
Nicht offen für weitere Antworten.

aze

Bekanntes Mitglied
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
 
keinen KeyAdapter nehmen sondern einen DocoumentenListener Bsp siehst du in der FAQ.
 
Versuch's mal mit einem eigenen Document. Beispiel:
Java:
...
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);
        }
    }
}
 
Ich hab jetz meine eigene document Klasse geschrieben :

Java:
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:

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

Was mach ich falsch ?
 
Zuletzt bearbeitet:
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
 
Upps,ich meinte ja super.insertString(offs,str,a) nicht den Konstruktor
Und das Semikolon muss vor die geschweifte Klammer. 🙂

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:
Java:
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
 
Zuletzt bearbeitet:
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:

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

und installiere dann einen MaskFormatter :

Java:
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.
 
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
 
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.
 
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
 
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.

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 ?
 
Wie meinst du das ? Was meinst du mit weiterleiten ? Installieren durch setFormatter ?
Nein. Durch diese Zeile installierst Du den DateFormatter:
Java:
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben