Hallo,
ich programmiere seit heute morgen zur Übung an einem Taschenrechner, der mit verschiedenen Eingabeformaten umgehen soll. Das Programm besteht aus 3 Klassen:
-der Main, die lediglich die GUI Klasse aufruft
-die GUI Klasse, in der sich alle GUI Elemente und ein setter für das Error Label befinden
-die Rechnen Klasse, in der die Eingabe der GUI verarbeitet werden soll und das Ergebnis an die GUI Klasse zurückgeben soll.
Nun stehe ich seit Stunden vor dem Problem, dass ich im Fall einer in der Rechen Klasse erkannten Fehleingabe eine Fehlermeldung über den Setter von der GUI Klasse einstellen will. Dafür muss ich natürlich die GUI Klasse in der Rechen Klasse aufrufen und durch den Konstruktor der GUI Klasse wird ein Frame über dem vorherigen erzeugt, auf den dann auch die Fehlermeldung steht, allerdings soll sich natürlich kein neues Fenster öffnen, sondern der Text im alten Frame angezeigt werden. Also der Fehlergrund ist mir soweit absolut klar, allerdings habe ich keine Möglichkeit gefunden das Problem zu lösen.
Ich habe hier im Forum zwar einige mit dem scheinbar gleichen Problem gefunden, allerdings haben die in den Threads gezeigten Lösungen bei mir nicht funktioniert. Mir geht es vorallem darum, für die Zukunft zu lernen, wie man diesem Problem begegnet, daher soll der Grundaufbau des Programms nicht zu sehr verändert werden, außer ich habe einen zu "unüblichen" Weg gewählt. Beachtet auch bitte den weiteren Aufbau des Pogrammes nicht weiter, ich musste das zumindest kurzzeitig Funktionsfähig bekommen, das wird von mir definitiv noch überarbeitet
Die Klasse GuiTaschenrechner:
Die Klasse Rechnen:
Die Main spare ich mir mal, da wird wie gesagt nur der Konstruktor der Klasse GuiTaschenrechner aufgerufen.
Danke im Voraus.
ich programmiere seit heute morgen zur Übung an einem Taschenrechner, der mit verschiedenen Eingabeformaten umgehen soll. Das Programm besteht aus 3 Klassen:
-der Main, die lediglich die GUI Klasse aufruft
-die GUI Klasse, in der sich alle GUI Elemente und ein setter für das Error Label befinden
-die Rechnen Klasse, in der die Eingabe der GUI verarbeitet werden soll und das Ergebnis an die GUI Klasse zurückgeben soll.
Nun stehe ich seit Stunden vor dem Problem, dass ich im Fall einer in der Rechen Klasse erkannten Fehleingabe eine Fehlermeldung über den Setter von der GUI Klasse einstellen will. Dafür muss ich natürlich die GUI Klasse in der Rechen Klasse aufrufen und durch den Konstruktor der GUI Klasse wird ein Frame über dem vorherigen erzeugt, auf den dann auch die Fehlermeldung steht, allerdings soll sich natürlich kein neues Fenster öffnen, sondern der Text im alten Frame angezeigt werden. Also der Fehlergrund ist mir soweit absolut klar, allerdings habe ich keine Möglichkeit gefunden das Problem zu lösen.
Ich habe hier im Forum zwar einige mit dem scheinbar gleichen Problem gefunden, allerdings haben die in den Threads gezeigten Lösungen bei mir nicht funktioniert. Mir geht es vorallem darum, für die Zukunft zu lernen, wie man diesem Problem begegnet, daher soll der Grundaufbau des Programms nicht zu sehr verändert werden, außer ich habe einen zu "unüblichen" Weg gewählt. Beachtet auch bitte den weiteren Aufbau des Pogrammes nicht weiter, ich musste das zumindest kurzzeitig Funktionsfähig bekommen, das wird von mir definitiv noch überarbeitet
Die Klasse GuiTaschenrechner:
Java:
package taschenrechner;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class GuiTaschenrechner extends JFrame {
JTextField tfRechnung;
JLabel labelAnleitung;
JLabel labelError;
JButton buttonRechnen;
public GuiTaschenrechner() {
setTitle("Taschenrechner");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
setSize(400, 230);
setResizable(false);
initComponents();
add(labelAnleitung);
add(tfRechnung);
add(buttonRechnen);
add(labelError);
setLocationRelativeTo(null);
setVisible(true);
}
public void initComponents() {
tfRechnung = new JTextField(20);
labelAnleitung = new JLabel("Geben sie ihre Rechnung ein:");
labelError = new JLabel("");
buttonRechnen = new JButton("Rechnen");
buttonRechnen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Rechnen r = new Rechnen(tfRechnung.getText());
tfRechnung.setText(tfRechnung.getText() + " = " + r.getErgebnis());
}
});
}
public void setErrorMsg(String s) {
labelError.setText(s);
}
}
Die Klasse Rechnen:
Java:
package taschenrechner;
public class Rechnen {
private String eingabe, eingabeFormat;
private String allowed, allowedNumbers, firstAllowedNumbers;
private String teil1, teil2, op;
GuiTaschenrechner g = new GuiTaschenrechner();
private int counter;
private double zahl1;
private double zahl2;
double result;
public Rechnen(String eingabe) {
this.eingabe = eingabe;
eingabeFormat = "";
this.teil1 = "";
this.teil2 = "";
this.op = "";
this.allowed = "0123456789.,*/+-";
this.firstAllowedNumbers = "0123456789";
this.allowedNumbers = "0123456789.";
counter = 0;
this.zahl1 = 0;
this.zahl2 = 0;
this.result = 0;
eingabe = eingabe.trim();
eingabe = eingabe.toLowerCase();
eingabe = eingabe.replaceAll("x", "*");
eingabe = eingabe.replaceAll(",", ".");
eingabeFormat = eingabe;
inputCheck(eingabeFormat);
part1(eingabeFormat);
part2(eingabeFormat);
zahl1 = parsing1(teil1);
zahl2 = parsing2(teil2);
result = ergebnis();
}
public void inputCheck(String eingabe) {
boolean io = false; // In Ordnung
for (int i = 0; i < this.eingabeFormat.length(); i++) {
io = false; //Überarbeiten
for (int j = 0; j < allowed.length(); j++) {
if (this.eingabeFormat.charAt(i) == allowed.charAt(j)) {
io = true;
}
}
if (!io) {
g.setErrorMsg("Eingaben überprüfen!");
}
}
}
public void part1(String eingabe) {
boolean noOp = true; // Kein Operator
boolean firstIsNumber = false;
while (noOp) {
for (int i = 0; i < firstAllowedNumbers.length(); i++) {
if (counter == 0 && eingabe.charAt(counter) == firstAllowedNumbers.charAt(i)) {
firstIsNumber = true;
teil1 = teil1 + eingabe.charAt(counter);
}
else if (counter == 0 && i == (firstAllowedNumbers.length() - 1) && !firstIsNumber) {
// Errormeldung und weitere Berechnung stoppen
}
else if (counter != 0 && eingabe.charAt(counter) == allowedNumbers.charAt(i)) {
teil1 = teil1 + eingabe.charAt(counter);
}
}
this.counter++;
if (teil1.length() < counter) {
op = op + eingabe.charAt(counter - 1);
noOp = false;
}
}
}
public void part2(String eingabe) {
boolean firstIsNumber = false;
boolean first = true;
while (counter < eingabe.length()) {
for (int i = 0; i < firstAllowedNumbers.length(); i++) {
if (first && eingabe.charAt(counter) == firstAllowedNumbers.charAt(i)) {
firstIsNumber = true;
first = false;
teil2 = teil2 + eingabe.charAt(counter);
}
else if (first && i == (firstAllowedNumbers.length() - 1) && !firstIsNumber) {
// Errormeldung und weitere Berechnung stoppen
}
else if (!first && eingabe.charAt(counter) == allowedNumbers.charAt(i)) {
teil2 = teil2 + eingabe.charAt(counter);
}
}
this.counter++;
}
}
public double parsing1(String teil1) {
try {
zahl1 = Double.parseDouble(teil1);
return zahl1;
} catch (Exception e) {
g.setErrorMsg("1. Zahl überprüfen!");
return 0;
}
}
public double parsing2(String teil2) {
try {
zahl2 = Double.parseDouble(teil2);
return zahl2;
} catch (Exception e) {
g.setErrorMsg("2. Zahl überprüfen!");
return 0;
}
}
public double ergebnis() {
if (op.equals("+")) {
return (zahl1 + zahl2);
}
else if (op.equals("-")) {
return (zahl1 - zahl2);
}
else if (op.equals("*")) {
return (zahl1 * zahl2);
}
else if (op.equals("/")) {
return (zahl1 / zahl2);
}
else {
return 0;
}
}
public double getErgebnis() {
return result;
}
}
Die Main spare ich mir mal, da wird wie gesagt nur der Konstruktor der Klasse GuiTaschenrechner aufgerufen.
Danke im Voraus.