Eingabeüberprüfung true, obwohl falsch


quidnovi

Erfahrenes Mitglied
#1
Hi @ all :)

stehe vor einem Problem, bei welchem ich nicht weiß, wie im inet zu suchen ist.

Habe vier Eingabefelder, in welchen die Werte abgefragt und anschließend berechnet werden:
Wenn etwas falsch ist, dann erscheint ein JOptionPane mit einer Fehlerbezogenen Info.

So weit so gut.
Wenn der Anwender nun die Fehlermeldung mittels dem Button bestätigt,
wird die Eingabe des beanstandeten Feldes gelöscht.
Jetzt kann der Anwender die Eingabe wiederholen.

Nun kommt der Fehler:
Sollte der Anwender abermals die falschen Werte eingeben, dann erscheint wohl die vorgesehene Fehlermeldung,
wenn er diese dann bestätigt, kommt er nicht wieder zur neuerlichen Eingabeaufforderung, sondern wird einfach weitergeleitet.

Hier der Code:
Java:
public void checkCalc4(String mlb, String mlh, String lw, String dlh) {

		// Eingabe ueberpruefen
		String lineMlb = mlb;
		String lineMlh = mlh;
		String lineLw = lw;
		String lineDlh = dlh;
		
		String pattern = "^[0-9]{3,4}$";
		Pattern r = Pattern.compile(pattern);
		
		Matcher mMlb = r.matcher(lineMlb);
		Matcher mMlh = r.matcher(lineMlh);
		Matcher mLw = r.matcher(lineLw);
		Matcher mDlh = r.matcher(lineDlh);
	
		if(mMlb.find()){
			validMlb = lineMlb;
			Masse.ok();
		}
		else{
			errPattern("Mauerlichte Breite");
			Masse.txtMlb.setText(null);
			return;
		}
		if(mMlh.find()){
			validMlh = lineMlh;
			Masse.ok();
		}
		else{
			errPattern("Mauerlichte H\u00F6he");
			Masse.txtMlh.setText(null);
			return;
		}
		if(mLw.find()){
			validLw = lineLw;
			Masse.ok();
		}
		else{
			errPattern("Lichte Weite");
			Masse.txtLw.setText(null);
			return;
		}
		if(mDlh.find()){
			validDlh = lineDlh;
			Masse.ok();
		}
		else{
			errPattern("Duchgangslichte H\u00F6he");
			Masse.txtDlh.setText(null);
			return;
		}
		
		// casten
		intMlb = Integer.parseInt(validMlb);
		intMlh = Integer.parseInt(validMlh);
		intLw = Integer.parseInt(validLw);
		intDlh = Integer.parseInt(validDlh);

		// ---------------------------------------------------------

		// Berechnen
		ergLw = intMlb - intLw;
		ergDlh = intMlh - intDlh;
		
		boolean positivLw = ergLw >= 250;
		boolean positivDlh = ergDlh >= 250;
		
		// Ergebnis ueberpruefen
		if (positivLw) {
			Masse.ok();
		}
		else{
			errCalcLw("Fehler: Lichte Weite");
			Masse.txtLw.setText(null);			
		}
		if (positivDlh) {
			Masse.ok();
		}
		else{
			errCalcDlh("Fehler: Durchgangslichte H\u00F6he");
			return;			
		}
	}
Masse.ok(); beinhaltet dann einen JButton, welcher auf die nächste Card weiterleitet - aja - issn CardLayout.


Zwei Fragen hätte ich nun:
Wieso wird die Eingabe nur einmal wiederholt, obwohl das Ergebnis falsch ist?
Wie kann ich's schaffen, dass diese Eingabeaufforderung solange wiederholt wird, bis diese true ergibt?

Vielen Dank im Voraus
 
Zuletzt bearbeitet:

quidnovi

Erfahrenes Mitglied
#2
Jetzt hab ich's mit einer while - Schleife probiert...die habe ich wohl falsch gecodet :(

Java:
ergLw = intMlb - intLw;
		
		while(ergLw < 249){
			errCalcLw("Lichte Weite");
			break;
		}
Dachte, solange die Bedingung nicht erfüllt ist, nicht weitergeleitet wird...
 

quidnovi

Erfahrenes Mitglied
#3
Nun weiß ich eindeutig, dass irgendetwas mit meinem übrigen Code nicht stimmt.
habe nun folgendes mit Erfolg getestet:

Java:
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class IfTest extends JFrame {

	private JPanel contentPane;
	private JTextField textField;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					IfTest frame = new IfTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public IfTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		textField = new JTextField();
		textField.setColumns(10);
		
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				testFeld();
			}
		});
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addContainerGap()
					.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addGap(18)
					.addComponent(btnNewButton)
					.addContainerGap(221, Short.MAX_VALUE))
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGap(27)
					.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
						.addComponent(textField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(btnNewButton))
					.addContainerGap(205, Short.MAX_VALUE))
		);
		contentPane.setLayout(gl_contentPane);
	}
	
	public void testFeld(){
		String feld = textField.getText();
		int i = Integer.parseInt(feld);
		System.out.println(i);
		if (i <= 249){
			JOptionPane.showMessageDialog(new JFrame(), "nochmal eingeben",
					"ERROR", JOptionPane.ERROR_MESSAGE);
			textField.setText(null);
		}
		else{
			System.exit(1);
		}
	}
}
Das Programm schließt sich erst, wenn das richtige eingegeben wurde.

Nun versuche ich meinen Quellcode zu durchforsten, vielleicht finde ich ja etwas.
In der Zwischenzeit bitte ich Euch, mir eventuelle Fehlerquellen zu nennen...vielleicht hatte ja schon mal jemand so ein Problem.
 

quidnovi

Erfahrenes Mitglied
#4
So...melde mich mit der Lösung des Problems :)

Wie man sehen kann, habe ich zuerst die false - Fälle geprüft und darauf mit Fehlermeldungen reagiert.
Wenn das Ganze abgearbeitet ist und keinerlei Fehler gefunden wurden,
dann spring ich in den else Zweig, wo dann mit Masse.ok(), weitere Schritte eingeleitet werden.

Das casten von String auf int, sowie die Berechnungen, laufen nach dem selben Schema ab.

Hier der Code, vielleicht ist's ja eine Hilfe für Java-Newbies wie mich :)
Java:
public void checkCalc4(String mlb, String mlh, String lw, String dlh) {

		// Eingabe ueberpruefen
		String lineMlb = mlb;
		String lineMlh = mlh;
		String lineLw = lw;
		String lineDlh = dlh;

		// Nur Zahlen von 0 - 9 zulassen und
		// minimum 3 - aber maximal 4 - stellig
		String pattern = "^[0-9]{3,4}$";
		Pattern r = Pattern.compile(pattern);

		// Jetzt überpruefen, ob die Bedingungen auch zutreffen
		Matcher mMlb = r.matcher(lineMlb);
		Matcher mMlh = r.matcher(lineMlh);
		Matcher mLw = r.matcher(lineLw);
		Matcher mDlh = r.matcher(lineDlh);

		// Wenn die Bedingungen nicht zutreffen
		// Fehlermeldung ausgeben und 
		// zustaendiges txtField nullen
		if (!mMlb.find()) {
			errPattern("Mauerlichte Breite");
			Masse.txtMlb.setText(null);
		}
		else if (!mMlh.find()) {
			errPattern("Mauerlichte H\u00F6he");
			Masse.txtMlh.setText(null);
		}
		else if (!mLw.find()) {
			errPattern("Lichte Weite");
			Masse.txtLw.setText(null);
		}
		else if (!mDlh.find()) {
			errPattern("Durchgangslichte H\u00F6he");
			Masse.txtDlh.setText(null);
		} 
		// Wenn diese zutreffen
		else {
			validMlb = lineMlb;
			validMlh = lineMlh;
			validLw = lineLw;
			validDlh = lineDlh;
			
			// casten
			int mlbInt = Integer.parseInt(validMlb);			
			int mlhInt = Integer.parseInt(validMlh);
			int lwInt = Integer.parseInt(validLw);
			int dlhInt = Integer.parseInt(validDlh);
			
			// Berechnen
			int ergLw = mlbInt - lwInt;
			int ergDlh = mlhInt - dlhInt;

			// Ergebnis ueberpruefen
			if (ergLw < 250) {
				// Mindestmass nicht eigehalten
				// Fehlermeldung ausgeben und
				// zustaendiges txtField nullen
				errCalcLw("Lichte Weite");
				Masse.txtLw.setText(null);
			}
			else if(ergDlh < 250){
				// Mindestmass nicht eigehalten
				// Fehlermeldung ausgeben und
				// zustaendiges txtField nullen
				errCalcDlh("Durchgangslichte H\u00F6he");
				Masse.txtDlh.setText(null);
			}
			else{
				// Gesamtüberpruefung erfolgreich
				Masse.ok();
			}
		}		
	}	

	// Fehlerausgabe message------------------------------------------

	public void errPattern(String str) {
		String message = str
				+ ":\nEs sind nur Zahlen von 0 - 9 mit mind 3 und max 4 Stellen erlaubt";
		JOptionPane.showMessageDialog(new JFrame(), message, "ERROR",
				JOptionPane.ERROR_MESSAGE);
	}

	public void errCalcLw(String str) {
		String message = str
				+ ":\n Die Seitenteilbreite(n) unterschreitet das Mass von 250mm, bitte eine kleinere Lichte Weite w\u00E4hlen";
		JOptionPane.showMessageDialog(new JFrame(), message, "ERROR",
				JOptionPane.ERROR_MESSAGE);
	}

	public void errCalcDlh(String str) {
		String message = str
				+ ":\n Die Oberlichte unterschreitet das Mass von 250mm, bitte eine kleinere Durchgangslichte H\u00F6he w\u00E4hlen";
		JOptionPane.showMessageDialog(new JFrame(), message, "ERROR",
				JOptionPane.ERROR_MESSAGE);
	}
Ich denke mal, dass dies auch eleganter lösbar ist, aber dazu reichen meine Kenntnisse noch zu wenig weit.
Sollte sich doch ein profissioneller Java - Progger finden, der eine "effienztierung (welch Wortschöpfung :D)" meiner Codezeilen schreiben mag, so würd's mich sehr freuen - mag ja auch ich effizienter werden :)
...deshalb lasse ich den thread noch offen :)

Winke inzwischen :)