Dialogbox solange abfragen, bis gültige Wert-Eingabe

maxmuster987

Aktives Mitglied
Ich wollte mal nachfragen, wie man das am besten löst, wenn man eine Dialogbox startet und nur bestimmte Werte akzeptiert.
Und wenn man einen falschen Wert eingibt (Zahl und/oder Buchstaben), dann soll die Dialogbox automatisch neu gestartet werden für eine Neueingabe.

Bisher habe ich das immer mit einer do-while Schleife realisiert im einfachsten Fall.

Java:
        do {
            String eing = JOptionPane.showInputDialog("Geben Sie den Wert 1 ein:");
            int wert = Integer.parseInt(eing);
        }
        while(wert!=1)

Da würde er mir die Dialogbox solange aufrufen, bis ich eine 1 eingegeben habe. Das ist natürlich zu einfach.
Wie mache ich das für den Anwendungsfall wie oben beschrieben? Wenn bspw. Zahlen von 1-10 gültig sind und alles andere zur Neueingabe führt und eine 0 zum Programmabbruch.

Bei einem Prof habe ich immer "etwas" von nachfolgender Struktur gesehen, bei der ich aber keine Ahnung habe, wie sie funktioniert mit diesem "boolean ende = true" und while(ende), ende=false etc.

Java:
import javax.swing.*;

public class Neueingabe {
    public static void main (String [] args) {
      
        boolean ende = true;
        int wert=0;
      
        while(ende) {
            String eing = JOptionPane.showInputDialog("Geben Sie einen Wert ein");
            wert = Integer.parseInt(eing);
            if (wert<=10|wert>0) {
                System.out.println("Eingabe ist korrekt und wird weiterverarbeitet");
                ende = false;
            }
            else {
                System.out.println("Fehleingabe, bitte neu eingeben.");
            } 
        }
      
        switch(wert) {
            case 1:
            System.out.println("1 wurde eingegeben");
            break;
            case 2:
            System.out.println("2 wurde eingegeben");
            break;

        }
    }
}

Der Code hier oben ist nicht korrekt, sondern soll nur das grobe Schema widerspiegeln, ich weiß leider auch nicht, wie der in korrekter Ausführung wäre.




Nachtrag:

Wenn ich den Code von ganz ganz oben verwende also mit der do-while Schleife, dann könnte ich das doch auch realisieren wie folgt:
Java:
        do {
            String eing = JOptionPane.showInputDialog("Geben Sie einen Wert 1-10 eim:");
            wert = Integer.parseInt(eing);
        }
        while(wert>10|wert<0);

Wenn ich außerhalb des Wertebereichs von 1-10 bin, dann öffnet sich die Box ständig erneut.

Aber trotzdem würde mich das mit dem boolean, ende, true interessieren, wie das funktioniert. Vielleicht ist das ja die bessere Option für solche Angelegenheiten.
 
Zuletzt bearbeitet:

KonradN

Top Contributor
Das Schema ist schon fast soweit korrekt, nur eben ist es etwas zu kompliziert umgesetzt und daher schwer verständlich. Und es gibt paar Flüchtigkeitsfehler wie wert <= 10 ODER Wert > 0 - was immer erfüllt ist :)

Der Ansatz aus meiner Sicht ist immer, dass man sich erst genau überlegt, was genau passieren soll. Und dass ist ja folgendes:

- So lange
--> Eine Zahl abfragen
- wie Zahl nicht gültig ist

Formulierungen kann man schon so wählen, dass diese zu Java Sprachkonstrukten passen ... So lange ... machen wie ... ist z.B. eine Beschreibung der do while Schleife.

Java:
int userAuswahl;
do {
    userAuswahl = frageZahlAb();
} while (!istGueltig(userAuswahl));

Damit hast Du dann auch das Problem aufgeteilt in Teilprobleme:

Methode frageZahlAb, welche eine Zahl zurück gibt. Wenn der Benutzer aber keine Zahl eingibt, dann schlägt das Parsen ja mit einer Exception fehl - die möchte man dann ja abfangen und reagieren ... da hast Du aber dann eine klare, konkrete Stelle, bei der dies passieren könnte.
- die Methode istGueltig hat dann die Validierungsregel.

Wenn sowas an mehreren Stellen gebraucht würde, dann hat man das auch direkt verfügbar - man muss sowas nicht doppelt haben.

Und der Code wird sehr lesbar. Du musst nicht überlegen, was der Code macht. Der Code lässt sich so ja schon direkt lesen.
 

maxmuster987

Aktives Mitglied
Wenn der Benutzer aber keine Zahl eingibt, dann schlägt das Parsen ja mit einer Exception fehl - die möchte man dann ja abfangen und reagieren

Um auf die Exception zurückzukommen, wie fange ich die ab? Ich kenne bisher nur ArithmeticException e, wenn bspw. durch 0 geteilt wird, dass er dann das Ganze abfängt. Gibt es dafür auch eine extra Exception, die ich noch nicht kenne?

Ich hab den Code jetzt mal damit so geschrieben:

Java:
import javax.swing.*;
public class Uebung {
    public static void main (String [] args) {
        try {
            int menue=0;
            String eing = JOptionPane.showInputDialog("Geben Sie die Anzahl der Maschinen ein:");
            int maschinen = Integer.parseInt(eing);           
            int feld[] = new int[maschinen];
            int gesamtzahl = 0;
            float durchschnitt = 0;
        
        
        
            do {
                System.out.println("=============================================");   
                System.out.println("=== Berechnung Zylinderkopfdichtungen ===");
                System.out.println("=============================================\n");
                System.out.println("(1) Produktionszahlen fuer " +maschinen +" Maschinen eingeben");
                System.out.println("(2) Produktionszahlen ausgeben");       
                System.out.println("(3) - ohne Funktion -");
                System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++");
                System.out.println("(0) Programmende\n");   
                
                String eing2 = JOptionPane.showInputDialog("Geben Sie Ihr Menue ein: ");
                menue = Integer.parseInt(eing2);
                
                switch(menue) {
                    case 0:
                        System.out.println("Programm beendet.");
                        System.exit(0);
                    break;
                    
                    case 1:
                        for(int i=0; i<maschinen; i++) {
                            String eing3 = JOptionPane.showInputDialog("Geben Sie die Produktionszahl fuer Maschine " +(i+1) + " ein");
                            int prodzahl = Integer.parseInt(eing3);
                            feld[i]=prodzahl;
                        }
                    break;
                    
                    case 2:
                        for(int i=0; i<maschinen; i++) {
                            gesamtzahl=gesamtzahl+feld[i];
                        }
                        durchschnitt=((float)(gesamtzahl))/maschinen;
                        System.out.println("Gesamtanzahl:\t " +gesamtzahl);
                        System.out.println("Durchschnitt:\t " +durchschnitt);
                    break;
                    
                    case 3:
                        System.out.println("Noch ohne Funktion.");
                    break;
                    
                    default:
                        System.out.println("Fehleingabe, bitte neu eingeben.");
                    break;           
                }           
            }
            while(menue!=0);
            System.exit(0);
        }
        catch (NumberFormatException ex) {
            System.out.println("Buchstabe eingegeben: " +ex);
        }   
    }
}



Nachtrag: Habe den Code mit NumberFormatException ergänzt, das sollte doch die richtige Exception sein, oder?
 
Zuletzt bearbeitet:

KonradN

Top Contributor
Schau Dir dazu einfach die Dokumentation an. Du rufst Integer.parseInt auf:
NumberFormatException - if the string does not contain a parsable integer.

Damit hast Du die Exception, die Du fangen müsstest.

Dann macht es immer Sinn, die Exception da zu fangen, wo diese auf auftritt. Also nicht die ganze Methode in ein try packen.

Und Du hast es ja schon an zwei Stellen! Einmal in Zeile 6 und dann noch einmal in Zeile 24 - daher macht es durchaus Sinn, das in einer eigenen Methode zu haben. (Oder bist Du noch so am Anfang, dass Du noch keine eigenen Methoden schreiben kannst? Dann wäre das natürlich schwer :) )



Und dann noch ein Hinweis zu lokalen Variablen: Es war früher bei Scripten üblich, Variablen am Anfang zu deklarieren. In der modernen Software Entwicklung ist es aber üblich, die Deklaration nahe an die Nutzung zu packen. Nur als kleines Beispiel schauen wir uns Deine Variable durchschnitt an. Diese verwendest Du ja nur an einer Stelle. Daher reicht es, die Variable dort zu deklarieren:
Java:
                    case 2:
                        for(int i=0; i<maschinen; i++) {
                            gesamtzahl=gesamtzahl+feld[i];
                        }
                        float durchschnitt=((float)(gesamtzahl))/maschinen;
                        System.out.println("Gesamtanzahl:\t " +gesamtzahl);
                        System.out.println("Durchschnitt:\t " +durchschnitt);
                    break;
 

maxmuster987

Aktives Mitglied
Ich habe jetzt schon bisschen mit Java programmiert, aber ich würde nicht behaupten, dass ich schon wirklich fortgeschritten o.Ä. bin darin, ich bin noch in der Aufbauphase und am lernen. Methoden habe ich auch schon paar geschrieben, wenn es um die Berechnung von bestimmten Formeln etc. ging und ich der Methode dann Werte übergebe.


Am Anfang habe ich tatsächlich auch die Variablen immer nahe an der Nutzung deklariert, aber mit der Zeit habe ich dann beim Kompilieren immer die Fehlermeldung bekommen, dass die Variable noch nicht initialisiert wurde (wird logischerweise an mir liegen, dass ich die irgendwie falsch initialisiert habe) und seitdem mache ich das immer direkt ganz am Anfang und seitdem habe ich diese Probleme selber nicht mehr.

Die Codes, die ich ja schreibe, die sind nicht sonderlich lang, wie es eigentlich üblich ist. Also ich rede hier von 100-200 Zeilen, deswegen ist das Ganze eigentlich noch relativ übersichtlich.
 

yfons123

Top Contributor
der unterschied ist wenn du sie in der klasse ( nahe am anfang ) hinschreibst dann bekommen sie automatisch standard werte wie zb ein int wird automatisch mit 0 gefüllt wenn nix anderses vorgegeben ist


wenn du eine variable in der method deklarierst dann wird die variable nicht automatisch initialisiert
 

KonradN

Top Contributor
Er hat nur eben keine Instanz- oder Klassenvariablen. Er nutzt nur lokale Variablen und er initialisiert sie immer direkt bei der Deklaration.
 

maxmuster987

Aktives Mitglied
Zeile 7 und Zeile 55. Das ist das, was ich eben angesprochen hatte.
Was hat das mit dem boolean Wert zu tun? Ich verstehe noch nicht, wieso diese Option auch die Dialogbox ständig wieder aufruft. Die Option finde ich irgendwie geschmeidiger und würde die eher nutzen als die do-while Schleife mit konkreten Zahlenwerten, wenn das mehr Sinn ergibt.

Java:
import java.io.*;
import javax.swing.*;
import java.util.*;

public class feldaktualisieren {
    public static void main (String[] args) {
        boolean aktiv = true;
        int i;
        int feld [] = new int [5];
        System.out.println("====================================");      
        System.out.println("==== Ein-/ Ausgabe eines Feldes ====");
        System.out.println("====================================\n");
        System.out.println("(1) Messwerte eingeben");
        System.out.println("(2) Messwerte ausgeben");
        System.out.println("(3) Einzelne Messwerte aktualisieren");
        System.out.println("====================================");
        System.out.println("(0) Programmende");
       
        do {
            String eing = JOptionPane.showInputDialog("Waehlen Sie eine Option:");
            int wahl = Integer.parseInt(eing);
       
            switch(wahl) {
                case 1:
                    for(i=0; i<5; i++) {
                        eing = JOptionPane.showInputDialog("Messwert " +(i+1) +" eingeben: ");
                        int messwert = Integer.parseInt(eing);
                        feld[i]=messwert;
                    }
                break;
               
                case 2:
                    for(i=0; i<5; i++) {
                        System.out.println("Messwert " +(i+1) +": " +feld[i]);
                    }
                break;
               
                case 3:
                    eing = JOptionPane.showInputDialog("Welchen Messwert wollen sie aktualisieren?");
                    wahl = Integer.parseInt(eing);
                    eing = JOptionPane.showInputDialog("Messwert " +wahl + " eingeben:");
                    feld[wahl-1]=Integer.parseInt(eing);
                    System.out.println("");
                break;
               
                case 0:
                System.out.println("Programm beendet.");
                System.exit(0);
               
                default:
                System.out.println("Falsche Eingabe - bitte neu.");
               
            }
        }
        while(aktiv);

        System.exit(0);  
    }
}
 

KonradN

Top Contributor
Das Ergebnis der Validierung wird da einfach nur in einer Variable gespeichert. Du hast also eine Variable, die speichert, ob man noch in der Schleife bleiben soll.
 

maxmuster987

Aktives Mitglied
Und wie erkennt die Variable, ob sie noch in der Schleife bleiben soll? Mit den konkreten Zahlenwerten kann man das ja noch einfach nachvollziehen, weil da sehe ich "Ah okay, solange ich bspw. innerhalb oder außerhalb von bestimmten Werten liege, soll sich die Box wieder öffnen".
Aber hier scheint mir das noch nicht so offensichtlich zu sein, um das nachvollziehen zu können.
 

KonradN

Top Contributor
Bei deinem letzten Code hast Du das in der Logik vergessen so ich es nicht übersehen habe. In #1 war in der Schleife ja auch:
Java:
            if (wert<=10|wert>0) {
                System.out.println("Eingabe ist korrekt und wird weiterverarbeitet");
                ende = false;
            }

==> Da wurde dann in Schleife geprüft und entschieden: Wir sind fertig.

Das macht so Code halt schwer lesbar. Die Prüfung gehört nun einmal in die Bedingung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Dialogbox sofort neustarten, falls aktuelle Eingabe falsch Java Basics - Anfänger-Themen 11
L Text und Ganzzahl in einer Dialogbox Java Basics - Anfänger-Themen 5
L Dialogbox statt Konsole verwenden Java Basics - Anfänger-Themen 5
M problem mit dialogbox Java Basics - Anfänger-Themen 2
S JList mit icons UND strings für Dialogbox Java Basics - Anfänger-Themen 2
O VersionsProbleme bei DialogBox Java Basics - Anfänger-Themen 5
N Eine Zahl solange teilen bis es nicht möglich ist und die Ergebnisse ausgeben Java Basics - Anfänger-Themen 23
W Parameter solange addieren bis 13 auftaucht Java Basics - Anfänger-Themen 11
G Events schreiben, solange Programm läuft Java Basics - Anfänger-Themen 6
J Große animierte Gif preloaden und solange mit einer nicht animierten ersetzen Java Basics - Anfänger-Themen 5
N Applet ruckelt solange Maus nicht in Bewegung? Java Basics - Anfänger-Themen 3
S If abfragen (+, - , /, *) Java Basics - Anfänger-Themen 13
Phash Websocket abfragen Java Basics - Anfänger-Themen 1
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
E schneller von der Datenbank abfragen Java Basics - Anfänger-Themen 15
M Checkbox abfragen und Radiobutton Group zurücksetzen Java Basics - Anfänger-Themen 1
L Datenpaare abfragen Java Basics - Anfänger-Themen 11
O ADT Graph nach größe Abfragen Java Basics - Anfänger-Themen 42
B Serial port abfragen Java Basics - Anfänger-Themen 18
F Ordner auf alle Unterdatein abfragen Java Basics - Anfänger-Themen 3
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
S boolean Wert von mehreren int Möglichkeiten abfragen ? Java Basics - Anfänger-Themen 4
H Variablen Methode zum Abfragen von Variablen aus Subklassen Java Basics - Anfänger-Themen 9
T Erste Schritte Textfeld abfragen ob etwas enthalten ist. Java Basics - Anfänger-Themen 17
S Asynchrone Socket-Abfragen Java Basics - Anfänger-Themen 5
S mehrfache if-Abfragen - beste Lösung Java Basics - Anfänger-Themen 1
E Abfragen des SimpleDateFormats Java Basics - Anfänger-Themen 1
L int array abfragen Java Basics - Anfänger-Themen 16
T Variablen Var aus While-Schleife abfragen -.-' Java Basics - Anfänger-Themen 9
Y Mehrdimensionales Array diagonal abfragen. Java Basics - Anfänger-Themen 5
S Datenbank auf Knopfdruck abfragen Java Basics - Anfänger-Themen 8
T if abfragen verkürzen Java Basics - Anfänger-Themen 5
M Wo Hilfsvariablen abfragen? Java Basics - Anfänger-Themen 1
M Farben/Color Abfragen von Farben innerhalb einer Methode Java Basics - Anfänger-Themen 9
M "Exceptions abfragen" Java Basics - Anfänger-Themen 6
M Frage nach BestPractice in if-Abfragen Java Basics - Anfänger-Themen 1
P Anlegen und Abfragen von Array List Java Basics - Anfänger-Themen 4
R IF Abfragen Java Basics - Anfänger-Themen 8
R If Abfragen Problem! Java Basics - Anfänger-Themen 4
I Button abfragen ob er geklickt wurde Java Basics - Anfänger-Themen 4
C If Abfragen Problem Java Basics - Anfänger-Themen 46
I Drei booleans abfragen Java Basics - Anfänger-Themen 2
R Input/Output Java String abfragen Java Basics - Anfänger-Themen 3
A Vokabel abfragen Java Basics - Anfänger-Themen 3
R Datentypen Datentyp eines Werts in einer Textdateizeile abfragen und ändern Java Basics - Anfänger-Themen 4
N Best Practice Stilistische Anwendung von if/else-Abfragen Java Basics - Anfänger-Themen 7
E Checkboxen abfragen Java Basics - Anfänger-Themen 10
H if abfragen Java Basics - Anfänger-Themen 38
C TreeMap Abfragen Problem Java Basics - Anfänger-Themen 7
S Abfragen wenn das ende einer Tabelle erreicht ist Java Basics - Anfänger-Themen 8
B mehrere Abfragen zusammenfügen Java Basics - Anfänger-Themen 3
H durch Schleife 50 Variablen abfragen Java Basics - Anfänger-Themen 8
B If abfragen! Java Basics - Anfänger-Themen 9
J checkbox status abfragen und drucken Java Basics - Anfänger-Themen 13
M AWT Applet - Button aus anderer Klasse abfragen Java Basics - Anfänger-Themen 4
F Bedingungen mit Abfragen verknüpfen Java Basics - Anfänger-Themen 7
P länge von array abfragen? Java Basics - Anfänger-Themen 2
Gossi Input/Output Datei Lesen, inhalt abfragen, speichern Java Basics - Anfänger-Themen 5
T jNumberField auf null abfragen Java Basics - Anfänger-Themen 5
Z Erste Schritte LinkedList Werte abfragen und vergleichen Java Basics - Anfänger-Themen 3
S Input/Output Welche Möglichkeiten Eingabe von User abfragen Java Basics - Anfänger-Themen 5
H Checkboxstatus abfragen Java Basics - Anfänger-Themen 10
S unzulässigen Wert abfragen - aber wo Java Basics - Anfänger-Themen 3
eLogic Aktive Internetverbindung abfragen Java Basics - Anfänger-Themen 21
B Abfragen eines Preises.. Java Basics - Anfänger-Themen 20
D Touchpad abfragen?! Java Basics - Anfänger-Themen 9
D Abfragen ob Excel-Dateien Makros enthalten? Java Basics - Anfänger-Themen 4
B Abfragen eines Excel-Feldes auf null Java Basics - Anfänger-Themen 17
B GridLayout - elemente mit Maus abfragen Java Basics - Anfänger-Themen 3
B Daten in Instanz einer Klasse ändern / abfragen Java Basics - Anfänger-Themen 12
M Datentypen String mit Trennzeichen abfragen Java Basics - Anfänger-Themen 7
D GUI Checkboxen in allen Klassen abfragen? Java Basics - Anfänger-Themen 5
B OOP String auf bestimmte Zeichen abfragen Java Basics - Anfänger-Themen 4
M Double.NaN abfragen Java Basics - Anfänger-Themen 6
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
H Objecttyp abfragen... Java Basics - Anfänger-Themen 11
N Zeilenanzahl einer TXT abfragen..? Java Basics - Anfänger-Themen 11
S Bremsen 3 IF-Abfragen ein Programm? Java Basics - Anfänger-Themen 7
T scanner bestimmtes format abfragen Java Basics - Anfänger-Themen 5
T JOptionPane mit .showInputDialog: Ergebnis abfragen? Java Basics - Anfänger-Themen 2
S Absatz aus Textdokument abfragen Java Basics - Anfänger-Themen 6
B gedrückte Tasten abfragen Java Basics - Anfänger-Themen 11
L "unschöne" if-Abfragen Java Basics - Anfänger-Themen 4
JFeel-x JComponent<-----Eigenschaften<-- Als Liste abfragen? Java Basics - Anfänger-Themen 8
P Pixelfarbe abfragen Java Basics - Anfänger-Themen 8
J einfache Tastendrücke in einem JFrame abfragen Java Basics - Anfänger-Themen 2
S if-Abfragen bringen mich zum VERZWEIFELN! Java Basics - Anfänger-Themen 12
B Aus JTable ImageIcon abfragen Java Basics - Anfänger-Themen 8
hdi Desktop-Auflösung abfragen -> setLocation() von Frame Java Basics - Anfänger-Themen 5
D jeditorpane checkbox abfragen? Java Basics - Anfänger-Themen 7
A Googel Lokal abfragen Java Basics - Anfänger-Themen 7
G in einem inputstream auf " " abfragen? Java Basics - Anfänger-Themen 3
T Rechner-Name abfragen Java Basics - Anfänger-Themen 6
N Event auf JTabbedPane abfragen ? Java Basics - Anfänger-Themen 8
M Maus position abfragen und setzen? Java Basics - Anfänger-Themen 1
L JTabel abfragen ob es eine erste Zeile gibt? Java Basics - Anfänger-Themen 2
G If Abfragen Java Basics - Anfänger-Themen 3
T Variablen Classübergreifen abfragen Java Basics - Anfänger-Themen 6
S Abfragen ob Label enabled ist . Java Basics - Anfänger-Themen 2
M Status von ext. Programm abfragen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben