Eingabe auf Zahlen beschränken

Status
Nicht offen für weitere Antworten.

DasBiest

Mitglied
Ich weiß, dass ein ähnliches Thema hier schon mal behandelt wurde, aber leider hat mir das nicht weiter geholfen.
Ich habe ein Textfeld in das nur Zahlen eingegeben werden sollen und ansonsten soll eine Fehlermeldung erscheinen. Mein Problem liegt jetzt darin, wie ich das vernünftig abfrage.
Mein erster Versuch:
Code:
void jTextField1_keyPressed(KeyEvent e)
  {
    int i;
      try
      {
       //Das ist Mist!!!!!
        i = Integer.valueOf(jTextField1.getText()).intValue();
      }
    catch (NumberFormatException ex)
    {
      JOptionPane.showMessageDialog(this, "Bitte nur Zahlen eingeben");

    }
Aber das ist doch sehr unglücklich ;)

Wie überprüfe ich vernünftig, ob ich eine Zahl oder einen Buchstaben eingebe??
 

Stefan1200

Top Contributor
Sorry, habe nicht gesehen, das du diese Variante schon kennst.
Ich lasse es trotzdem nochmal stehen für spätere Besucher mit ähnlichen Problemen.

Hmm, eine Möglichkeit wäre so:

Code:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int eingabe = 0;

while (true)
{
    System.out.println("Bitte geben Sie eine Zahl ein:");
    try
    {
        eingabe = Integer.parseInt(br.readLine());
    }
    catch (NumberFormatException e)
    {
        System.out.println("Nur Zahlen eingeben!");
        continue;
    }
}

System.out.println("Juhu, Sie haben eine Zahl eingegeben!");

Vielleicht hilft dir das weiter.
 

DasBiest

Mitglied
Hm, das hilft mir jetzt ja auch nicht weiter.
Das Problem ist, das jetzt egal was ich eingebe, er grundsätzlich alles anmeckert, sprich bei jeder Eingabe das Infofenster aufpoppt. Und das soll er ja nur bei Buchstaben machen.
Wie müsste das aussehen???
Variable deklarieren, gucken ob Zahl oder Buchstabe, dafür jeweils true oder false setzen und davon abhängig die Try, catch Klausel steuern???
Wie mach ich das in Code??????
 

jptc.org

Bekanntes Mitglied
ist zwingend erforderlich die Eingabe ständig zu prüfen? Würde es nicht reichen bei der Bestättigung eines OK-buttons oder ähnlichen eine Prüfung aller eingebener Werte vorzunehmen? Prinzipiell sollte es mit Integer.parseInt() gehen, die Methode liefert auch gleich ein int zurück. Am besten ist Du trimst auch noch die Eingabe, denn Leerzeichen am Ende oder Anfang interessieren meist nicht wirklich. Bei der ständigen Überprüfung auf das KeyPressed-Event kommt es schnell zu einem flackerntem Eingabefeld.

Ich hoffe das konnte helfen.

Karsten Voigt
http://www.java-performance-portal.org
 

Mick

Bekanntes Mitglied
Code:
void jTextField1_keyPressed(KeyEvent e)
  {
    int i;
      try
      {
        i = Integer.parseInt(jTextField1.getText().trim());
      }
    catch (NumberFormatException ex)
    {
      JOptionPane.showMessageDialog(this, "Bitte nur Zahlen eingeben");

    }


So macht man das normalerweise.

Grüße,
Mick

[edit]da war einer schneller ;)[/edit]
 

gustav

Aktives Mitglied
Ich nehme mal an, das Du was grafisches hast. Dann lässt Du dich bestimmt nach jedem Tastendruck oder zumindest nach dem Bestätigen informieren.
Entweder Du checkst jetzt nach jedem Tastendruck ob das letzte Zeichen in Deiner Eingabe noch stimmt (if (eingabe.charAt( ende) >='0') && ( ...<='9')) ) ODER Du gehst Deine gesamte Eingabe mit einer Schleife durch und prüfst dann.

Code:
void jTextField1_keyPressed(KeyEvent e)
  {
    String tex = jTextField1.getText() ;
    int len = tex.length() ;
     
    if (len > 0)  // falls die Eingabe leer ist
      if  ( ! ( (tex.charAt(len-1)>='0') && (tex.charAt(len-1)<='9')) ) 
      {
        JOptionPane.showMessageDialog(this, "Bitte nur Zahlen eingeben");
      }
  }

Hab ich jetzt nicht ausprobiert aber die Richtung sollte in etwa stimmen.....
 

DasBiest

Mitglied
Also optimal wäre, wenn eine Eingabe von Zahlen gar nicht möglich wäre, aber das ist wohl noch etwas zu hoch für mich ;)

Zu euren Vorschlägen:
Ich habe das mit
Code:
      try
      {
        i = Integer.parseInt(jTextField1.getText().trim());
      }
    catch (NumberFormatException ex)
    {
      JOptionPane.showMessageDialog(this, "Bitte nur Zahlen eingeben");
      jTextField1.setText("");
    }

ausprobiert, aber da erscheint bei jeder Eingabe egal ob Zahl oder Buchstabe das Info-Fenster?!?!?

Und bei :
Code:
 String tex = jTextField1.getText() ;
    int len = tex.length() ;

    if (len > 0)  // falls die Eingabe leer ist
      if  ( ! ( (tex.charAt(len-1)>='0') && (tex.charAt(len-1)<='9')) )
      {
        JOptionPane.showMessageDialog(this, "Bitte nur Zahlen eingeben");
      }

Ist das Problem, dass er nach der Eingabe des 2ten Buchstaben oder der Zahl nicht prüft, d.h. ich kann z.B. 9p in das Textfeld eingeben, ohne das er es anmeckert :(
Ich verzweifel hier noch *schluchz*
In C war das alles viel einfacher!!!!!
 

gustav

Aktives Mitglied
Sorry hab einige Feinheiten nicht beachtet !

Also, die keypressed Message ist nur bedingt für Dein Problem geeignet (zumindest mit meiner Lsg), da erst der Tastendruck bearbeitet wird und dann erst der String in jTextField1 angepasst wird. Kurz gesagt, die Methode hinkt immer einen Eingabeschritt hinterher. Eine Lösung wäre nun einfach die Taste die gedrückt wurde abzufragen - dafür gibts ja http://java.sun.com/j2se/1.4.2/docs/api/ unter KeyEvent !!!
Code:
void jTextField1_keyPressed(KeyEvent e)
  {
    char zeichen = e.getKeyChar() ;
    if (! ( (zeichen >= '0') && (zeichen <= '9')))
    {
      JOptionPane.showMessageDialog(this, "Bitte nur Zahlen eingeben") ;
    }
  }
Nachteil ist allerdings, das hier jetzt nur wirkliche Zahlen durchgelassen werden und z.B. Sondertasten wie Backspace ebenfalls Fehlermeldungen provozieren. Natürlich kannst Du diese Taste noch extra in Deinen Code unterbringen.

Mein 2. Vorschlag lehnt sich an den gestrigen an, benutzt aber die keyReleased Message. Hierbei sollte die Methode erst aufgerufen werden, wenn der String bereits in jTextField1 angepasst wurde. Allerdings mußt Du hier den String dann von Hand wieder einkürzen. Eventuell ruft Java dann auch die Methode mehrmals hintereinander auf (es wird ein setText() gemacht) Das kannst Du dann aber extra herausfinden und ist eventuell nur für das PerformanceTuning wichtig....

Code:
  void jTextField1_keyReleased(KeyEvent e)
  {
    String tex = jTextField1.getText() ;
     int len = tex.length() ;

     if (len > 0)  // falls die Eingabe leer ist
     {
       char zeichen = tex.charAt(len -1) ;
       if (! ( (zeichen >= '0') && (zeichen <= '9')))
       {
         JOptionPane.showMessageDialog(this, "Bitte nur Zahlen eingeben") ;
         
         // String berichtigen !!!!
         jTextField1.setText( tex.substring(0, len-1));
       }
     }
  }
 

DasBiest

Mitglied
:D
@Gustav
Ich hab jetzt mal deinen 2ten Vorschlag übernommen und bis jetzt funzt das sehr gut.
Herzlichen Dank!!
 

DasBiest

Mitglied
Ich habe jetzt ein neues Prob wegen der Abfrage :(
Und zwar möchte ich, dass wenn ich in dem Textfield "Enter" drücke, der Cursor ins nächste Fenster springt. An und für sich kein Prob, allerdings wenn ich das mit in die keyReleased-Methode einbaue, habe ich das Problem, wenn ich einen Buchstaben eingebe und das Infofenster hochpoppt und ich das dann mit "Enter" bestätige, der Cursor ins nächste Textfield springt. Habe dann versucht, das ganze mit Hilfe einer Variable zu umgehen, aber das funzt leider auch nicht :(
Hat jemand vielleicht ne Idee wie ich das löse??
Code:
void jTextField1_keyReleased(KeyEvent e)
  {
    String tex = jTextField1.getText();
    int len = tex.length();
    boolean i = true;

    if (len > 0)  //falls die Eingabe leer ist
    {
      char zeichen = tex.charAt(len -1);
      if (!((zeichen >= '0') && (zeichen <= '9')))
      {
        JOptionPane.showMessageDialog(this, "Bitte nur ganze Zahlen eingeben!");
        i=false;
        //String berichtigen!!!
        jTextField1.setText(tex.substring(0, len-1));
      }
    }//If_Ende

   //Weiter mit Enter
    if ((e.getKeyCode()==KeyEvent.VK_ENTER ) && (i==true))
    {
      jTextField2.requestFocus();
    }//IF_Ende

  }
 

gustav

Aktives Mitglied
Deine Variable ist nur lokal für die Methode sichtbar. Eventuell wird durch das drücken der ENTER Taste ein neues Event für dich ausgelöst. Dieses durchläuft natürlich den gesamten Code (incl boolean i = true).
Versuch es mal mit eines globalen Variante. Allerdings würde ich sagen, das es dann Probleme mit der richtigen Unterscheidung zwischen den Enter's gibt.
 
G

Guest

Gast
Komt ein wenig spät, aber ... :)

Eine weitere Möglichkeit wäre die Methode
Code:
JTextField.getDocument().insertString(..)
zu überschreiben.

Code:
public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException {
	try {
		Integer.parseInt(s);
	} catch (NumberFormatException e) {
		return;
	}

	super.insertString(offset, s, attributeSet);
}

Ich habe das nicht getestet aber so müsste es im Grunde genommen aussehen.
 

daily

Aktives Mitglied
Hab zu dem Thema hier noch eine andere Lösung. Und zwar als Document das man für das TextField verwenden kann. Schmankerl hierbei ist dass man noch einen Wert übergibt der die maximale Anzahl Zeichen für das Textfeld angibt.

Code:
import java.awt.Toolkit;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class StandardDocumentNumbers extends PlainDocument {

	private int maxLength_ = Integer.MAX_VALUE;

	public StandardDocumentNumbers(int maxLength) {
		this.maxLength_ = maxLength;
	}

	public void insertString(final int offset, final String toInsert,
			final AttributeSet notUsed) throws BadLocationException {
	
		if (toInsert == null) return;		
		
		int actualLength = this.getLength();
		boolean isInt = true;
		
		if (actualLength + toInsert.length() < this.maxLength_) {
			String [] splitted = toInsert.split("");
			
			for (int i = 1; i< splitted.length; i++){
				
				if (!(splitted[i].toString().equals("1") || splitted[i].toString().equals("2") || splitted[i].toString().equals("3") 
						|| splitted[i].toString().equals("4") || splitted[i].toString().equals("5") 
						|| splitted[i].toString().equals("6") || splitted[i].toString().equals("7") 
						|| splitted[i].toString().equals("8") || splitted[i].toString().equals("9") 
						|| splitted[i].toString().equals("0"))) isInt = false;
			}
			
			if (isInt) super.insertString(offset, toInsert, notUsed);
			
		} else {
			Toolkit.getDefaultToolkit().beep();
		}
	}

}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Eingabe im jTextField auf Zahlen beschränken Java Basics - Anfänger-Themen 2
M Regex nur Zahlen und Punkt zulassen, Keine Eingabe(Leeres TextFeld) nicht zulassen Java Basics - Anfänger-Themen 6
M Erste Schritte primzahlen ermitteln, nur zahlen als eingabe erlauben Java Basics - Anfänger-Themen 34
D Anzahl von Zahlen bei eingabe begrenzen Java Basics - Anfänger-Themen 37
H Zufällig generierte Zahlen auf Eingabe prüfen Java Basics - Anfänger-Themen 5
R Einzelne Zahlen von der Eingabe (Scan) weiterverarbeiten Java Basics - Anfänger-Themen 3
H Die Eingabe von beliebig vielen Zahlen in ein Array - ich kann es nicht Java Basics - Anfänger-Themen 6
T keine buchstaben!nur zahlen eingabe möglich Java Basics - Anfänger-Themen 48
F Eingabe von Ganzen Zahlen oder Strings mit BufferedReader Java Basics - Anfänger-Themen 10
G JTextField nur Eingabe von Zahlen erlauben Java Basics - Anfänger-Themen 4
K Eingabe von Zahlen und anschliessend höchste Zahl ausgegeben Java Basics - Anfänger-Themen 11
V Eingabe von Zahlen festlegen Java Basics - Anfänger-Themen 2
B Nur Zahlen bei Eingabe zulassen? Java Basics - Anfänger-Themen 23
graai Zeichenmustr malen mit Eingabe Java Basics - Anfänger-Themen 7
Torschti Eingabe von Dezimalzahlen (bis zu zwei Kommastellen) Java Basics - Anfänger-Themen 11
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
T Eingabe durch eine Zahl dividieren nachgucken? Java Basics - Anfänger-Themen 4
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Jul1n4tor Scanner error bei Eingabe die kein Integer ist Java Basics - Anfänger-Themen 4
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
M Dialogbox sofort neustarten, falls aktuelle Eingabe falsch Java Basics - Anfänger-Themen 11
M Dialogbox solange abfragen, bis gültige Wert-Eingabe Java Basics - Anfänger-Themen 12
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
A Bei VierGewinnt Eingabe per Buchstabe (a,b,c...) Java Basics - Anfänger-Themen 2
java-starter Erste Schritte Eingabe in Char wert umwandeln Java Basics - Anfänger-Themen 7
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Eingabe limit Java Basics - Anfänger-Themen 8
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
H Eingabe tätigen bevor Graphics g Fenster öffnet Java Basics - Anfänger-Themen 5
H For-Schleife bis Index von Eingabe laufen lassen Java Basics - Anfänger-Themen 24
Hamudi Bachir 2D Array eingabe vom Benutzer Java Basics - Anfänger-Themen 31
S Warum erscheint bei mir "Hallo Welt" und nicht die aktuelle Eingabe? Java Basics - Anfänger-Themen 16
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
B Array bei jeder Eingabe um eins erweitern Java Basics - Anfänger-Themen 3
TimoN11 IntelliJ , Ausgabe von einem Quellcode in Eingabe eines Quellcodes Java Basics - Anfänger-Themen 1
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
chocobear26 Interface JOptionPane - Dialog_Fenster zeigt immer vorherige Eingabe an. Java Basics - Anfänger-Themen 4
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
M JTextField nur Zahleneingaben zulassen, eingabe sperren Java Basics - Anfänger-Themen 24
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
N Eingabe erkennen, ob groß oder kleingeschrieben worden ist Java Basics - Anfänger-Themen 22
N Fehlerausgabe bei falscher Eingabe der Users Java Basics - Anfänger-Themen 3
N Eingabe des Users direkt hinter die Ausgabe Java Basics - Anfänger-Themen 3
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
O Mehrfache Scanner-Eingabe durch Komma getrennt Java Basics - Anfänger-Themen 6
M String array durch Eingabe begrenzen Java Basics - Anfänger-Themen 7
iman Eingabe von Benutzer Filter machen. Java Basics - Anfänger-Themen 7
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
M Verschiedene Eingabe = Verschiedene Ausgaben Java Basics - Anfänger-Themen 5
H Eingabe Java Basics - Anfänger-Themen 7
F Bedingung für Eingabe Java Basics - Anfänger-Themen 2
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
Dimax Erste Schritte String Eingabe Prüfen Java Basics - Anfänger-Themen 11
R Eingabe String umwandeln zu Integer Werten Java Basics - Anfänger-Themen 8
B Türme von Hanoi mit einer beliebigen aber gültigen Eingabe lösen Java Basics - Anfänger-Themen 5
D While Schleife bei Bedarf durch Eingabe stoppen Java Basics - Anfänger-Themen 15
J Eingabe Einschränken Java Basics - Anfänger-Themen 1
Zrebna Compiler-Fehler Java-Compiler wird nach 'javac' keyword-Eingabe nicht gestartet (Erste Übung) Java Basics - Anfänger-Themen 18
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
D Array via Eingabe befüllen Java Basics - Anfänger-Themen 6
M Wie kann ich eine Eingabe im Java-Swing übergeben? Java Basics - Anfänger-Themen 1
N Abbrechen einer Eingabe endet im Fehler Java Basics - Anfänger-Themen 3
S Konsolen eingabe Java Basics - Anfänger-Themen 17
M Scanner-Eingabe nach gewissem Zeitraum überprüfen Java Basics - Anfänger-Themen 2
x-tshainge Bei if (eingabe = = ... ) enter als eingabe nehemen Java Basics - Anfänger-Themen 4
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
S Eingabe in anderer Klasse verwenden Java Basics - Anfänger-Themen 3
T Input/Output Falsche Eingabe ausgeben Java Basics - Anfänger-Themen 3
R Ratespiel mit Return und einer Eingabe Java Basics - Anfänger-Themen 1
K Eingabe in Array speichern und Ausgeben Java Basics - Anfänger-Themen 9
J Eingabe des Scanners an einer bestimmten Position Java Basics - Anfänger-Themen 6
J Input/Output Den zweiten Output erst nach Eingabe ausgeben Java Basics - Anfänger-Themen 4
S Eingabe auf Richtigkeit und Reihenfolg überprüfen Java Basics - Anfänger-Themen 3
R Java CMD Eingabe verbergen Java Basics - Anfänger-Themen 4
L Eingabe überprüfen Java Basics - Anfänger-Themen 7
M Eingabe des Benutzers Verwenden Java Basics - Anfänger-Themen 9
T Input/Output Int Eingabe auf Zahl überprüfen Java Basics - Anfänger-Themen 30
S Method mit Eingabe abrufen Java Basics - Anfänger-Themen 1
N Operatoren Suchen nach einer bestimmten Eingabe (durch Scanner) Java Basics - Anfänger-Themen 7
K Überprüfen ob Eingabe ein Float ist Java Basics - Anfänger-Themen 4
G Warum funktioniert das Programm für negative Eingabe nicht? Java Basics - Anfänger-Themen 3
O Erste Schritte Eingabe anweisungen eliminieren Java Basics - Anfänger-Themen 3
G Objekt Instanziierung von Eingabe abhängig machen Java Basics - Anfänger-Themen 5
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
B Interface JTextField Eingabe als String verwenden Java Basics - Anfänger-Themen 3
F Abfrage ob Eingabe eine Zahl ist Java Basics - Anfänger-Themen 3
H Alternative Eingabe Java Basics - Anfänger-Themen 3
L Bei falscher Eingabe soll NaN zurückgegeben werden, Rückgabetyp jedoch double Java Basics - Anfänger-Themen 3
J Methoden Eingabe Methode nur Buchstaben Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben