Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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:
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)
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!
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.
@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?
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?
@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?
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.
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?
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...
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.
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!
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....