Fehlerbehandlung bei leeren TextFields

Status
Nicht offen für weitere Antworten.

Vril

Bekanntes Mitglied
Hallo,

ich habe eine GUI mit mehreren TextFields erstellt, die Inhalte der TextFields werden nach drücken eines Buttons via StringTokenizer in Strings und double umgewandelt und über die Konsole ausgegeben, jedoch habe ich noch ein Problem:

Wenn nicht alle TextFields gefüllt werden, werden in der Konsole eine ganze Menge Fehler ausgegeben, kann man dies irgendwie abfangen, wahrscheinlich beim StringTokenizer?
 

mic_checker

Top Contributor
kommt auf deinen konkreten code an, also was für methoden du alles aufrufst etc.

dann musst du schauen was für exceptions geworfen werden.

kannst ja mal was von dem code posten....

je nachdem welche methoden du aufrufst führt das natürlich zu nem fehler wenn du nichts im textfeld drin stehen hast.
 

Vril

Bekanntes Mitglied
Also ich hab da eben mehrere StringTokenizer, für jedes TextField einen, auf String oder double:

Code:
	public void Werte(){
		
		//Daten für die Materialspezifikation/beschreibung
		String Materialname = new String(TF_Materialname.getText());
		System.out.println(Materialname);
		
		String Materialnr = new String(TF_Materialnr.getText());
		System.out.println(Materialnr);

                	StringTokenizer st01 = new StringTokenizer(TF_Reibung.getText());
		double Reibung = Double.parseDouble(st01.nextToken());
		System.out.println(Reibung);

usw.......

Und dann einen Button, bei dessen click alles ausgeführt wird:

Code:
if(event.getActionCommand().equals("  Berechnen  ")){
	  	  	Werte();
Und hier mal alle Fehlermeldungen die kommen, wenn die TextFields nicht ausgefüllt sind. Sind sie ausgefüllt, kommen natürlilch keine Fehlermeldungen!

Hoffe Du kannst mir weiterhelfen!




Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:332)
at HaptikUI22.Werte(HaptikUI22.java:1179)
at HaptikUI22.actionPerformed(HaptikUI22.java:1120)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:18
49)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav
a:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258
)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:234)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212
)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1766)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:234)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
 

mic_checker

Top Contributor
Bevor du auf (mögliche) Elemente in einem StringTokenizer zugreifst, solltest du erstmal checken ob überhaupt Elemente enthalten sind.

Zudem sollte StringTokenizer nicht mehr verwendet werden, du kannst stattdessen zu split von String greifen.
 

lin

Top Contributor
Code:
if(textfield.getText().length() == 0) {
System.out.println("textfield is empty"); 
} else {
//do sth
}
 

Vril

Bekanntes Mitglied
Also die Variante von lin gefällt mir schon mal sehr gut! Danke!

Wir funktioniert das mit split?
 

Vril

Bekanntes Mitglied
Dann hätte ich noch eine Frage! Und zwar habe ich hier:

Code:
if(textfield.getText().length() == 0) { 
System.out.println("textfield is empty"); 
} else { 
//do sth 
}

für //do sth habe ich den StringTokenizer... eingefügt. Bei dem System.out.println("textfield is empty") startet ein JDialog der die Meldung bringt das eine Eingabe hier zwingend ist, da sonst keine Berechnung durchgeführt werden kann! Der Dialog startet auch einwandfrei, jedoch wenn ich ok clicke, wird die Berechnung trotzdem ausgeführt. Was kann ich machen damit hier zur Eingabemaske zurückgekehrt wird und keine Berechnung ausgeführt wird?

Zur Info: Bisher läuft es so, das beim Button "Berechnen" die TextFields durchgegangen werden, Werte();, Fehlerdialog startet, und dann halt new Berechnung(); gestartet wird!
 

Sky

Top Contributor
Noch ein Vorschlag: Du könntest deine Textfelder um einen DocumentListener erweitern. Bei jeder Eingabe könntest Du dann prüfen, ob die Bedingungen zum aktivieren des Buttons vorliegen. D.h. der Button zum Berechnen kann erst wirklich dann geklickt werden, wenn deine "Pflichtfelder" ausgefüllt sind.
 

Vril

Bekanntes Mitglied
@sky80
Dein Vorschlag hört sich sehr gut an! Jedoch hab ich mit dem DocumentListener noch nie etwas gemacht und die Literatur schreibt hierzu auch nur sehr wenig!

Könntest du mir vielleicht ein Beispiel geben wie das bei einem JTextField, dessen Inhalt nicht leer sein darf aussehen müsste?
 

MPW

Top Contributor
Vril hat gesagt.:
für //do sth habe ich den StringTokenizer... eingefügt. Bei dem System.out.println("textfield is empty") startet ein JDialog der die Meldung bringt das eine Eingabe hier zwingend ist, da sonst keine Berechnung durchgeführt werden kann! Der Dialog startet auch einwandfrei, jedoch wenn ich ok clicke, wird die Berechnung trotzdem ausgeführt. Was kann ich machen damit hier zur Eingabemaske zurückgekehrt wird und keine Berechnung ausgeführt wird?

Hä?
Dann hasst du einen Code-Fehler drin, es kann nur if oder else ausgeführt werden, nicht beides.

Oder benutzt du eine switch Anweisung, dann musst du break benutzen.

Ich kann das nicht ganz^^ nachfollziehen, poste mal den Code mit dem JOptionPane.
 

Sky

Top Contributor
Vril hat gesagt.:
@sky80
Dein Vorschlag hört sich sehr gut an! Jedoch hab ich mit dem DocumentListener noch nie etwas gemacht und die Literatur schreibt hierzu auch nur sehr wenig!

Könntest du mir vielleicht ein Beispiel geben wie das bei einem JTextField, dessen Inhalt nicht leer sein darf aussehen müsste?

Ja klar:

Code:
    // Listener anlegen
    MyDocumentListener mdl = new MyDocumentListener();
    
    // Textfelder anlegen
    JTextField tf1 = new JTextField();
    JTextField tf2 = new JTextField();
    this.getContentPane().add(tf1, BorderLayout.NORTH);
    this.getContentPane().add(tf2, BorderLayout.SOUTH);

    // Listener hinzufügen
    tf1.getDocument().addDocumentListener( mdl );
    tf2.getDocument().addDocumentListener( mdl );

Und der zugehörige Listener:

Code:
class MyDocumentListener implements DocumentListener {
  public void insertUpdate( DocumentEvent e ) {
    System.out.println( "insertUpdate" );
  }

  public void removeUpdate( DocumentEvent e ) {
    System.out.println( "removeUpdate " );
  }

  public void changedUpdate( DocumentEvent e ) {
    System.out.println( "changedUpdate" );
  }
}

Nun hast Du verschiedene Möglichkeiten: Du könntest z.B. einen Counter mitlaufen lassen, der bei jedem Remove prüft, ob Zeichen vorhanden sind und beim insert, ob die neue Länge genau ein Zeichen ist. In diesen Fällen muss dein Counter verringert bzw. erhöht werden. Wenn dein Counter genau 0 ist, so liegen keine Änderungen vor.
 

Vril

Bekanntes Mitglied
Schon mal Vielen Dank für das auführliche Beispiel!

Jetzt hätte ich noch eine Frage, und zwar muss bzw. kann man hier:
Code:
public void insertUpdate( DocumentEvent e ) { 
    System.out.println( "insertUpdate" ); 
  }
noch eine if Abfrage rein machen, die abfrägt um welches TextField es sich handelt oder wird hier bereits jedes TextField abgefragt das einen DocumentListener erhalten hat?
 

mic_checker

Top Contributor
Du musst natürlich noch nachschauen welches Textfeld da geändert wurde, schließlich muss ja in allen Textfeldern was stehen..
 

Vril

Bekanntes Mitglied
Wie macht man das richtig?
Klappt das so auch:
Code:
if(e.getActionCommand().equals(tf1)){
			if(tf1 == 0){
new FehlerDialog;
	}
else{
Berechnen();
}
}
Oder was nimmt man an Stelle von getActionCommand() ?
 

Sky

Top Contributor
mic_checker hat gesagt.:
Du musst natürlich noch nachschauen welches Textfeld da geändert wurde, schließlich muss ja in allen Textfeldern was stehen..
Jein. Es reicht ggfls. auch aus zu wissen, dass es leere Felder gibt; in diesem Fall gibt man beim Klick auf OK eine allgemeine Meldung aus, dass nicht alle Felder gefüllt sind...
 

mic_checker

Top Contributor
Ja, aber ich dachte er wollte den Ansatz verfolgen das man nur dann OK/Weiter/Wie auch immer anklicken kann wenn alles ausgefüllt wurde,bzw. wenn überhaupt was drin steht....ist dann natürlich die frage ob er es so oder so haben will.
 

Vril

Bekanntes Mitglied
Also ich hab ca. 20 JTextFields, 5 davon sind Pflichtfelder (also Eingabe zwingend) und 15 Kannfelder (Eingabe optional).

Ich weiss jetzt auch nicht was einfach oder sinnvoller ist, das man den Button "Berechnen" erst clicken kann wenn die Pflichtfelder gefüllt sind oder das man den "Berechnen" Button immer clicken kann, bei fehlenden Pflichtangaben aber ein JOptionPane Error kommt, mit entsprechendem Hinweis und eine Berechnung nicht ausgeführt wird!

Zumindest bin ich mir bei beiden Möglichkeiten nicht sicher wie ich das am sinnvollsten einbaue, das JOptionPane zu starten ist kein Problem, aber die Berechnung unterbinden ist dann problematisch!
 

MPW

Top Contributor
Voll nicht, gib' mir mal den Teil Code wo's darum geht, du brauchst du das nur so machen:

Code:
if (TF1.getText() == "" |  TF2.getText() == "" | TF3.getText() == "" | TF4.getText() == "" | TF5.getText() == "") {
   //JOptionPane aufrufen
} else {
    //berechnung ausführen
}

Wo soll denn da das Problem liege, das ist das einfachste auf der Welt: Ein Wenn-Dann-Befehl!
 

mic_checker

Top Contributor
ich finde den ansatz sauberer - den afaik sky80 gepostet hat - sprich: erst gar nicht zulassen das man auf ok klickt , wenn man nicht alles ausgefüllt hat.

Btw. wenn du auf die "Kann"-Felder auch String Tokenizer anwendest, kannst du da natürlich immer noch Fehler kriegen, das ist ja klar....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
R Swing JTextField getText() liefert leeren String AWT, Swing, JavaFX & SWT 6
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
A Swing JTextField durch einen JButton leeren AWT, Swing, JavaFX & SWT 15
K Swing JTable Text im Hintergrund einer leeren Tabelle AWT, Swing, JavaFX & SWT 3
kniffel Ausgabe von leeren JTable Zeilen AWT, Swing, JavaFX & SWT 3
M Swing JTable cell leeren bei Eingabe AWT, Swing, JavaFX & SWT 6
G Path leeren AWT, Swing, JavaFX & SWT 2
D Erzeugen eines leeren Graphics-Objektes AWT, Swing, JavaFX & SWT 7
W Swing JPasswordField "leeren" AWT, Swing, JavaFX & SWT 3
D JList leeren AWT, Swing, JavaFX & SWT 3
N Jtextfield leeren AWT, Swing, JavaFX & SWT 9
R JTable darstellen von leeren Zellen AWT, Swing, JavaFX & SWT 12
G JFormattedTextField lässt sich nicht mehr leeren AWT, Swing, JavaFX & SWT 4
G JFrame "leeren" AWT, Swing, JavaFX & SWT 5
M Textfelder leeren AWT, Swing, JavaFX & SWT 6
D JTextArea leeren AWT, Swing, JavaFX & SWT 3
S JDialog und 'Inhalte' schliessen bzw. leeren AWT, Swing, JavaFX & SWT 9
M JTextField nach erfolgreicher Eingabe leeren? AWT, Swing, JavaFX & SWT 2
sliwalker ContentPane leeren und völlig neu bestücken? AWT, Swing, JavaFX & SWT 4
S JavaFX: voneinander abhängige TextFields AWT, Swing, JavaFX & SWT 33
B JavaFX Textfields: Fortschritt als ProgressBar und Progressindicator AWT, Swing, JavaFX & SWT 5
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
F In Action Listener TextFields einlesen und prüfen. Abbruch bei falschen Eingaben. Wie mache ich das? AWT, Swing, JavaFX & SWT 2
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
M Event Handling TextFields und Suchfunktion AWT, Swing, JavaFX & SWT 10
M Swing Butten & TextFields aus Applet im JFrame nicht sichtbar AWT, Swing, JavaFX & SWT 2
F KontextMenü auf allen Textfields im Frame AWT, Swing, JavaFX & SWT 2
N Eingabe eines Textfields weiterverwenden AWT, Swing, JavaFX & SWT 6
I Textfields dynamisch erzeugen AWT, Swing, JavaFX & SWT 4
S Scrollbares Bild und Unsichtbare TextFields AWT, Swing, JavaFX & SWT 7
loadbrain auslesen der Werte dynamischer Textfields AWT, Swing, JavaFX & SWT 21
H TextFields anordnen AWT, Swing, JavaFX & SWT 8
G Unterschiedliche Textfields ansprechen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben