Eingabeprüfung JTextField. Fehler bei Copy-Paste

endidu

Mitglied
Hallo,

Ich habe ein Document zusammengebastelt, damit ich in einem JTextField nur bestimmte Zahlen (0.0 - 8.9) eingeben kann.

Hier die Quelcode:
Java:
	@Override
	public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException{
		if ((getLength() + s.length()) <= limit) {
			int zahl = 0;
			
			if(getLength()+s.length() == 1){
				try{
					zahl = Integer.parseInt(s);
					if (zahl > 8)
						return;
				}catch(Exception ex){   //!< nur Integerwerte sind erlaubt
					Toolkit.getDefaultToolkit().beep(); 
					return ;
				}
				super.insertString(offset,s, attributeSet);
			}
			else if(getLength()+s.length() == 2){
				if(!s.equalsIgnoreCase("."))
					return;
				super.insertString(offset,s, attributeSet);
			}
			else if(getLength()+s.length() == 3){
				try{
					Integer.parseInt(s);
				}catch(Exception ex){   //!< nur Integerwerte sind erlaubt
					Toolkit.getDefaultToolkit().beep(); 
					return ;
				}
				super.insertString(offset,s, attributeSet);
			}
		}
    }

Wenn ich danach im JTextFeld eintippe, funktioniert es ganz gut. Aber wenn ich copy-paste mache, geht es irgendwie nicht. zB. wenn ich versuche 2.0 zu kopieren und in JTextFeld einzufügen, klappt es nicht. Kann mir jemand erklären, wieso es nicht geht?

Habe auch diesen Link gelesen. Hier kann man aber mehrere "." stellen, das ist aber auch nicht erwünscht.
http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/7213-jtextfield-dokumentarten.html#post37821

Gibt es oder einen einfachen Weg, indem ich Zahlen schon bei der Eingabe überprüfen kann. Was sollte ich zB. machen, wenn das obige Beispiel die Zahlen bis 20.0 akzeptiert. Dann kann "." entweder an der 2. Stelle oder an der 3. Stelle stehen. Muss ich dann immer so mit if-Bedingungen überprüfen?

Danke im Voraus.
 
Hm, das sieht hinreichend kompliziert aus. Versuch doch mal den Code so umzuschreiben, dass du zuerst der komplette Textinhalt erzeugt wird, dann kannst du den in ein Double parsen und prüfen ob er deinem Intervall entspricht. Das dürfte im Endeffekt zumindest lesbarer sein.

Am vorhanden Code vermute ich, dass im Teil
Java:
                try{
                    Integer.parseInt(s);
                }catch(Exception ex){   //!< nur Integerwerte sind erlaubt
                    Toolkit.getDefaultToolkit().beep(); 
                    return ;
                }
                super.insertString(offset,s, attributeSet);
Das Problem liegt. Wenn du nämlich ein s="2.0" reinkopierst, dann ist das eben kein Integer sondern ein Double.

Eine ganz andere Alternative könnte ein JSpinner sein. Hier kann man Unter- und Obergrenze der Eingabe direkt angaben und ist so ggfs intuitiver zu verwenden.
 
erstmal sorry für die späte Antwort.
Versuch doch mal den Code so umzuschreiben, dass du zuerst der komplette Textinhalt erzeugt wird, dann kannst du den in ein Double parsen und prüfen ob er deinem Intervall entspricht

Wie schaffe ich den kompletten Textinhalt zu erzeugen? Dann kann ich aber beim Eintippen nichts grenzen oder?

Eine ganz andere Alternative könnte ein JSpinner sein. Hier kann man Unter- und Obergrenze der Eingabe direkt angaben und ist so ggfs intuitiver zu verwenden.

Danke für den Tipp.. Da ich aber mit JGoodies arbeite, muss ich noch bisschen recherchieren, wie man JSpinner mit JGoodies binden kann. Ich werde noch daran arbeiten.
 
Genau, der DocumentListener ist eine gute Lösung, weil du damit alle Änderungen mitbekommst. Ansonsten sind InputVerifier dafür geeignet die Eingabe in Textfeldern zu prüfen und ggfs. sogar zu verbieten die Felder zu verlassen.
Letzterer ist für den Anfang einfacher -finde ich- bekommt die Änderung aber erst mit, wenn der Fokus aus dem Textfeld springt.
 

Neue Themen


Zurück
Oben