JFormattedTextField und maximal 3 Stellen.

Status
Nicht offen für weitere Antworten.
S

Sym

Gast
Hallo,

ich möchte ein JFormattedTextField haben, welches einen int von max. 3 Stellen erwartet. Nur leider fehlt mir das richtige Pattern:

Code:
myField.setFormatterFactory(new DefaultFormatterFactory(new NumberFormatter(new DecimalFormat("<PATTERN>"))));

So sieht mein Code bisher aus. Doch wie sieht <PATTERN> dann aus?

Gruß und Dank
 

Niki

Top Contributor
Da ich lange mit Java 1.3 gearbeitet habe, habe ich die JFormattedTextFields nie gebraucht, das ganze würde auch so gehen:

Code:
	JTextField tf = new JTextField();
	tf.setDocument(createNumericDocumentWithMaxLength(3));

private Document createNumericDocumentWithMaxLength(final int maxLength){
		
		Document doc = new PlainDocument(){
			@Override
			public void insertString(int offs, String str, AttributeSet a)
					throws BadLocationException {
				if(getLength() + str.length() > maxLength)
					return;
				if(!str.matches("^[\\d]*$"))
					return;
				
				
				super.insertString(offs, str, a);
			}
		};
		return doc;
		
	}
 

lhein

Top Contributor
gehts noch komplizierter?

Code:
MaskFormatter formatter = new MaskFormatter("###");
JFormattedTextField myField = new JFormattedTextField(formatter);

das sollte genügen.

lr
 
S

Sym

Gast
@Niki: Das sieht nett aus, ist aber mMn viel zu oversized. Keep it simple. ;)

@LR: Damit erreichst Du aber auch, dass minimal 3 Stellen besetzt sein müssen.
 

Niki

Top Contributor
Eben :D
Deswegen meinen "komplizierten" Code verwenden, der macht was er soll.

Du kannst das ganze ja auch in ein abgeleitetes TextFeld packen, dann brauchst du immer nur sagen:
Code:
NumericTextField tf = new NumericTextField(3);
 

mimo

Aktives Mitglied
Versuch mal:

Code:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
import java.text.*;
import java.util.*;


/**
 * Formatiertes Textfeld für Eingaben von Integerwerte
 * gibt den Fokus nur weiter, wenn die aktuelle Eingabe
 * korrekt formatiert ist.
 */
   

public class JIntTextField 
extends JFormattedTextField
{
    
    //Variablen
    
    private InputVerifier inVeri = new JIntTextFieldVerifier();
    private MaskFormatter fm;
    private int alignment = JTextField.LEFT;
    private Font font = new Font("Arial", Font.PLAIN, 10);
    /*
     *Konstruktor IntTextFeld für 3 Ziffern
     */
    /** Creates a new instance of JMoneyTextField */
    public JIntTextField() {
        
        //Format für Textfeld erzeugen
        setHorizontalAlignment(alignment);
        setFont(font);
        //Formatierer-Factory für PlzMaske erzeugen und registrieren
        AbstractFormatterFactory ff = new DefaultFormatterFactory();
        setFormatterFactory(ff);
        //Falsche Eingabe
        setFocusLostBehavior(JFormattedTextField.COMMIT);
        //InputVerifier registrieren
        setInputVerifier(inVeri);
       
       
    }
    
    
     
}

class JIntTextFieldVerifier extends InputVerifier {
         
         public boolean verify(JComponent input) {
         boolean returnvalue = false;
         JFrame dialog = new JFrame("JIntTextField");  
         
             if (input instanceof JFormattedTextField) {
                 //InputVerifier wurde für JFormattedTextField registriert
                 // -> prüfe Eingabe mit Formatter des Textfelds
                 
                 JFormattedTextField ftf = (JFormattedTextField) input;
                 String vergleich = "";
                 String text = ftf.getText();
                 if (text.length()<1) {
                     returnvalue = true;
                 } else {
                     try {
                         Integer d = Integer.valueOf(text);
                         if(text.length()<=3){ returnvalue = true;} //überprüft die Anzahl der Stellen
                     } catch (NumberFormatException e) {
                         JOptionPane.showMessageDialog(dialog, "Bitte geben Sie max. drei Ziffern ein!");
                     }
                 }   
             }   
                     // -> Eingabe durchlassen
                     return returnvalue;
         }      
}
 
S

Sym

Gast
@LR: Das war aber nicht die Anforderung. ;)

@Niki: Ja, vielen Dank für Deinen Tipp. Aber der Formatter ist (wenn ich das richtig sehe) genau für solche Dinge vorgesehen. Und den würde ich gerne nutzen und verstehen. ;)
 
S

Sym

Gast
@mimo: Auch Dir vielen Dank. Aber so möchte ich das nicht. ;)

@all: Ich weiß schon, wie ich das Problem lösen könnte. Ich möchte aber eine möglichst elegante Lösung. Und ich meine, der Formatter sollte sowas hergeben, oder nicht?
 

lhein

Top Contributor
Code:
        NumberFormatter nf = new NumberFormatter();
        nf.setAllowsInvalid(false);
        nf.setValueClass(Integer.class);
        nf.setMinimum(new Integer(0));
        nf.setMaximum(new Integer(999));
        JFormattedTextField myField = new JFormattedTextField(nf);

ist sicher nicht die beste Lösung, aber sollte gehen.

lr
 

*Hendrik

Bekanntes Mitglied
Ich würde bzw. verwende auch den "komplizierten" Code von Niki. Hier in den FAQs ist es noch mal beschrieben. Das JFormattedTextfield weist ein unschönes/anderes Verhalten als ein JTextfield auf, wenn man mit der Maus reinklickt (vielleicht auch beim reintaben), da das Feld automatisch mit Leerzeichen vorbelegt ist. D.h. wenn Du reinklickst landest Du u.U. irgendwo in der Mitte und nicht am Anfang. Im Grund musst Du also immer diese Leerzeichen überschreiben. (Soweit ich das noch in Erinnerung habe). Deswegen verwende ich lieber ein JTextField, erweitere ein PlainDocument und überschreibe dessen insertString() Methode. Dem erweiterten PlainDocument könntest Du zusätzlich Parameter übergeben, z.B. für die max. Anzahl der einzugebenen Zeichen oder/und ob es sich um ein alphanumerischen oder numerisches Feld handelt und entsprechend in insertString() behandeln. So kannst Du das Document noch für andere Textfelder verwenden.
 

lhein

Top Contributor
Code:
        NumberFormat nmf = new DecimalFormat("000");
        NumberFormatter nf = new NumberFormatter(nmf);
        nf.setAllowsInvalid(false);
        nf.setOverwriteMode(true);
        JFormattedTextField myField = new JFormattedTextField(nf);

Das ist fast noch einfacher ;)

lr
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
S JFormattedTextField dezimal variabler Länge AWT, Swing, JavaFX & SWT 12
Ghostman1711 Java JFormattedTextfield MaskFormatter ohne Leerzeichen AWT, Swing, JavaFX & SWT 3
N Swing JFormattedTextField keine Werte nach Formatzuweisung AWT, Swing, JavaFX & SWT 0
M European Article Number (EAN) in JFormattedTextfield AWT, Swing, JavaFX & SWT 3
L JFormattedTextField AWT, Swing, JavaFX & SWT 3
B Swing JFormattedTextField AWT, Swing, JavaFX & SWT 4
Y JFormattedTextfield - Aktualisierung und Beschränkung AWT, Swing, JavaFX & SWT 4
V Swing Nullpointer Exception bei JFormattedTextField AWT, Swing, JavaFX & SWT 4
S Swing JFormattedTextField - bei nicht korrekter Eingabe Inhalt überschreiben AWT, Swing, JavaFX & SWT 5
S Swing JFormattedTextfield markiert nicht gesamten Inhalt AWT, Swing, JavaFX & SWT 4
C Swing Button in Textfeld (JFormattedTextField) AWT, Swing, JavaFX & SWT 7
A jformattedtextfield unsichtbar und wieder sichtbar machen AWT, Swing, JavaFX & SWT 13
C Swing JFormattedTextField + Eurobetrag AWT, Swing, JavaFX & SWT 2
E Problem mit MaskFormatter und JFormattedTextField AWT, Swing, JavaFX & SWT 3
A EventListener für JFormattedTextField AWT, Swing, JavaFX & SWT 6
B Swing Betrag mit Komma aus jformattedtextfield auslesen. AWT, Swing, JavaFX & SWT 2
E Swing JFormattedTextField Live Validierung AWT, Swing, JavaFX & SWT 4
C Swing Default Werte für JFormattedTextField und Eingaben zurücksetzen AWT, Swing, JavaFX & SWT 5
G JFormattedTextField und DefaultButton AWT, Swing, JavaFX & SWT 6
B Swing JFormattedTextField auf mehreren JPanels in einer JTabbedPane AWT, Swing, JavaFX & SWT 3
G JFormattedTextField values AWT, Swing, JavaFX & SWT 8
R JFormattedTextField AWT, Swing, JavaFX & SWT 8
D Eingabemaske im JFormattedTextField ändern AWT, Swing, JavaFX & SWT 3
D JFormattedTextfield um Grafik erweitern AWT, Swing, JavaFX & SWT 15
N JFormattedTextField erst Verlassen, wenn Eingabe korrekt AWT, Swing, JavaFX & SWT 6
G JFormattedTextField lässt sich nicht mehr leeren AWT, Swing, JavaFX & SWT 4
N PropertyChangeListener an JFormattedTextField AWT, Swing, JavaFX & SWT 7
D Problem mit JFormattedTextField AWT, Swing, JavaFX & SWT 6
A Problem mit JFormattedTextField auslesen AWT, Swing, JavaFX & SWT 11
M JFormattedTextField und Null-Werte AWT, Swing, JavaFX & SWT 4
E JformattedTextField, Dialog und weitere Kleinigkeiten . AWT, Swing, JavaFX & SWT 2
E Problem mit Validierende Eingabefeldern JFormattedTextField AWT, Swing, JavaFX & SWT 8
B JFormattedTextField mit DecimalFormat in ein Double AWT, Swing, JavaFX & SWT 11
C JFormattedTextField - nur bestimmte Zeichen zulassen AWT, Swing, JavaFX & SWT 3
H JFormattedTextField - Einen Preis eingeben lassen AWT, Swing, JavaFX & SWT 2
B Zeichen werden im JFormattedTextField überschrieben AWT, Swing, JavaFX & SWT 3
H JFormattedTextField AWT, Swing, JavaFX & SWT 4
W IP-Adresse mit JFormattedTextField AWT, Swing, JavaFX & SWT 5
F JFormattedTextField formatieren AWT, Swing, JavaFX & SWT 7
J [JFormattedTextField] Nur Zahlen eingebbar AWT, Swing, JavaFX & SWT 3
S [JFormattedTextField] Ja wie denn nun? AWT, Swing, JavaFX & SWT 2
G Datumseingabe mit JFormattedTextField AWT, Swing, JavaFX & SWT 4
B Wert bei JFormattedTextField automatisch aktualisieren AWT, Swing, JavaFX & SWT 2
H Frage zu JFormattedTextField AWT, Swing, JavaFX & SWT 2
G Problem mit JFormattedTextField AWT, Swing, JavaFX & SWT 3
M Datumseingabe in ein JFormattedTextfield AWT, Swing, JavaFX & SWT 2
F Problem mit JFormattedTextField AWT, Swing, JavaFX & SWT 4
A JFormattedTextField - vertical misalignment problems... AWT, Swing, JavaFX & SWT 12
T [Neuling] Textfeld Inhalt überprüfen und falsche Stellen als msg Ausgeben AWT, Swing, JavaFX & SWT 1
X JFrame erst nach dem Laden sichtbar stellen AWT, Swing, JavaFX & SWT 8
H Swing Ausgabe auf 2 nachkomma stellen beschränken AWT, Swing, JavaFX & SWT 3
A JTextfields unveränderbar stellen AWT, Swing, JavaFX & SWT 3
C RadioButton nicht änderbar stellen, ohne das Sie grau wird AWT, Swing, JavaFX & SWT 9
S JTextField auf 3 Stellen begrenzen AWT, Swing, JavaFX & SWT 2
W Instanz eines Steuerelementes an zwei Stellen zeichnen AWT, Swing, JavaFX & SWT 3
Z JComboBox auf ReadOnly stellen AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben