JavaFX mini Taschenrechner!

Guten Tag,

ich versuche einen mini Taschenrechner zu Programmieren. Es sollen eigentlich nur 2 Zahlen über ein TextField eingetragen werden und sobald man auf den Button "berechne" klickt soll das Ergebnis raus kommen.

Meine Probleme damit sind:
- Wie sage ich dem TextField das es sich um Integer oder Double Werte handelt? Ich dachte an so etwas!
Code:
        TextField a = new TextField();
          a.setOnAction((ActionEvent event) -> {
                try{
                    Integer i = Integer.parseInt(a.getText());
                }catch (NumberFormatException e){
                  
                }
            });
- Wie sage ich dann dem Button "berechne" ob Addiert oder Subtrahiert werden soll? Und wie bekomme ich dann die Integer oder Double Werte in diese Methode?

Das Programm sieht bis jetzt so aus:
Java:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javafx.scene.layout.GridPane;




public class Taschenrechner extends Application {
    
    public void start(Stage primaryStage) {
        ObservableList<String> options =
                FXCollections.observableArrayList(
                    "+",
                    "-"
                );
        ComboBox<String> comboBox = new ComboBox<>(options);
        comboBox.setValue("+");
        
        Button button2 = new Button("Berechne");
        TextField a = new TextField();
          a.setOnAction((ActionEvent event) -> {
                try{
                    Integer i = Integer.parseInt(a.getText());
                }catch (NumberFormatException e){
                  
                }
            });
        
        TextField b = new TextField();
        TextField c = new TextField();
        c.setDisable(true);
        GridPane gridPane = new GridPane();
        gridPane.add(new Label("Zahl1"), 0, 0);
        gridPane.add(new Label("Zahl2"), 2, 0);
        gridPane.add(new Label("Ergebnis"), 4, 0);
        gridPane.add(a, 0,1);
        gridPane.add(b, 2,1);
        gridPane.add(c, 4,1);
        gridPane.add(comboBox, 1, 1);
        gridPane.add(button2, 3, 1);
        
        Scene scene = new Scene(gridPane, 700, 80);
        primaryStage.setTitle("Mein Taschenrechner");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        Application.launch(args);       
    }

}
Kann mir dabei jemand weiter Helfen?

LG
 
So jetzt klappt die Berechnung. Das einzige Problem was ich jetzt habe ist zu erkennen was für ein Typ von Zahl der Benutzer eingeben würde!
Natürlich könnte ich das ganze auch einfach über Strings rechnen :)
Doch das gefällt mir nicht. Weiß jemand einen effektiven Weg um aus dem TextField die Zahl herauszubekommen?

Hier jetzt mal mein Code bis jetzt :)
Java:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javafx.scene.layout.GridPane;

public class Taschenrechner extends Application {
    ComboBox<String> comboBox = new ComboBox<>();
    TextField zahl1 = new TextField();
    TextField zahl2 = new TextField();
    TextField ergebnis = new TextField();
    
    public void start(Stage primaryStage) {
        ObservableList<String> options =
                FXCollections.observableArrayList(
                    "+",
                    "-"
                );
        comboBox.setItems(options);
        comboBox.setValue("+");
        ergebnis.setDisable(true);
        Button button2 = new Button("Berechne");
        button2.setOnAction( (ActionEvent event) -> ergebnis.setText(berechne()));
        
        GridPane gridPane = new GridPane();
        gridPane.add(new Label("Zahl1"), 0, 0);
        gridPane.add(new Label("Zahl2"), 2, 0);
        gridPane.add(new Label("Ergebnis"), 4, 0);
        gridPane.add(zahl1, 0,1);
        gridPane.add(zahl2, 2,1);
        gridPane.add(ergebnis, 4,1);
        gridPane.add(comboBox, 1, 1);
        gridPane.add(button2, 3, 1);
        
        Scene scene = new Scene(gridPane, 700, 80);
        primaryStage.setTitle("Mein Taschenrechner");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    private String berechne() {
        if(comboBox.getValue() == "+") {
            Number n = Integer.parseInt(zahl1.getText()) +     Integer.parseInt(zahl2.getText());
            return n.toString();
        }
        else {
            Number n = Integer.parseInt(zahl1.getText()) -     Integer.parseInt(zahl2.getText());
            return n.toString();
        }
                
            
    }
    
    public static void main(String[] args) {
        Application.launch(args);       
    }

}

Was mir noch nicht wirklich gefällt ist die Auswahl von + und -. Wenn man mehre Funktionalität zur Verfügung stellen möchte also z. B. hier jetzt noch durch *, / und %. Dann muss ich ja für jeden Fall eine if abfrage machen oder geht das auch irgendwie schöner?

LG
 
Wie 'ne Map aussieht? In Java 8 Syntax, z. B.

Java:
    static final Map<String, BiFunction<Number, Number, Number>> binaryOperations = new HashMap<>();

    static {
        binaryOperations.put("+", (a,b) -> a.doubleValue() + b.doubleValue());
        binaryOperations.put("-", (a,b) -> a.doubleValue() - b.doubleValue());
        binaryOperations.put("*", (a,b) -> a.doubleValue() * b.doubleValue());
        binaryOperations.put("/", (a,b) -> a.doubleValue() / b.doubleValue());
    }
 
Wie 'ne Map aussieht? In Java 8 Syntax, z. B.
Wie eine Map aussieht weiß ich ja :D
Mein Problem war das ich nicht verstanden habe das du alles in eine Map machst :) bzw. das so etwas überhaupt geht :D

Jetzt habe ich nur immer noch die Frage:
Der Operator ist ja an die ComboBox gebunden muss ich nun comboBox.getValue() abfragen und das dann der Map binaryOperations übergeben?

Sorry ich weiß das sind sicherlich total doofe Fragen!!! Doch wenn man das noch nie gemacht hat ist so etwas echt ätzend :D

LG
 
Du könntest erst nach Integer parsen und falls das nicht möglich ist, nach double.
Eigentlich wollte ich das TextField nur auf Zahlen beschränken. Hab dazu etwas gegooglet doch leider nicht verstanden.
Denn wenn eine Eingabe so aussehen würde: 23,17 <- ist es eine Zahl aber in Java eben nicht :D 23.17 müsste dort stehen.
Wenn ich das TextField auf solche Zahlen also mit Punkt und Komma abbilden möchte muss ich das sicherlich alles über Strings rechnen und abfragen? oder?
 
Der Operator ist ja an die ComboBox gebunden muss ich nun comboBox.getValue() abfragen und das dann der Map binaryOperations übergeben?
So in etwa:
Java:
    private String berechne() {
        BiFunction<Number, Number, Number> b = binaryOperations.get(comboBox.getValue());
        if (b != null) {
            return b.apply(Integer.parseInt(zahl1.getText()), Integer.parseInt(zahl2.getText()))
                    .toString();
        }
        return "";
    }
 
auf so etwas komme ich sicherlich nie :(

Danke. Werde das mal zusammen bauen und schauen das es läuft :)
Der endgültige Taschenrechner Post ich hier dann nochmal :D

LG
 
12291
Java:
import java.util.*;
import java.util.function.BiFunction;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javafx.scene.layout.GridPane;




public class Taschenrechner extends Application {
    ComboBox<String> comboBox = new ComboBox<>();
    TextField zahl1 = new TextField();
    TextField zahl2 = new TextField();
    TextField ergebnis = new TextField();
    Map<String, BiFunction<Number, Number, Number>> binaryOperations = new HashMap<>();

     
   
    public void start(Stage primaryStage) {
       
        binaryOperations.put("+", (a,b) -> a.doubleValue() + b.doubleValue());
        binaryOperations.put("-", (a,b) -> a.doubleValue() - b.doubleValue());
        binaryOperations.put("*", (a,b) -> a.doubleValue() * b.doubleValue());
        binaryOperations.put("/", (a,b) -> a.doubleValue() / b.doubleValue());
        comboBox.setItems( (ObservableList<String>) FXCollections.observableArrayList("+","-","*","/"));
        comboBox.setValue("+");
        ergebnis.setDisable(true);
        Button button2 = new Button("Berechne");
        button2.setOnAction( (ActionEvent event) -> ergebnis.setText(berechne()));
       
        GridPane gridPane = new GridPane();
        gridPane.add(new Label("Zahl1"), 0, 0);
        gridPane.add(new Label("Zahl2"), 2, 0);
        gridPane.add(new Label("Ergebnis"), 4, 0);
        gridPane.add(zahl1, 0,1);
        gridPane.add(zahl2, 2,1);
        gridPane.add(ergebnis, 4,1);
        gridPane.add(comboBox, 1, 1);
        gridPane.add(button2, 3, 1);

       
        Scene scene = new Scene(gridPane, 700, 80);
        primaryStage.setTitle("Mein Taschenrechner");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
   
    private String berechne() {
         BiFunction<Number, Number, Number> b = binaryOperations.get(comboBox.getValue());
            if (b != null) {
                return b.apply(Double.parseDouble(zahl1.getText()), Double.parseDouble(zahl2.getText()))
                        .toString();
            }
            return "";          
    }
   
    public static void main(String[] args) {
        Application.launch(args);      
    }

}

So läuft der Rechner doch gar nicht so schlecht. Was mich jetzt noch stört ist das ich im TextField immer noch Buchstaben eingeben kann :D aber eins nach dem anderen.

vielleicht kannst du mir nochmal hiermit Helfen mit der Map @mihe7
Java:
Map<String, BiFunction<Number, Number, Number>> binaryOperations = new HashMap<>();
Verstehe ich das richtig? Wir erstellen eine Map mit dem Inhalt (String und BiFunction). Die BiFunction bekommt 2 Number übergeben und return einen Number. Die erforderliche apply Methode aus dem Interface wird durch die Lambda-Ausdrücke redefiniert:
Java:
binaryOperations.put("+", (a,b) -> a.doubleValue() + b.doubleValue());
Da wir oben Number, Number geschrieben haben, sind a und b Number Objekte.

Habe ich das so weit richtig verstanden?
 
auf so etwas komme ich sicherlich nie :(
Wobei b als Variablenname jetzt auch nicht der "Hit" ist :)

Ansonsten: durch die funktionalen Features kommt man auf Dinge, die man vorher versucht hätte, zu vermeiden. Das geht ja auch alles ohne, ist halt entsprechender Schreibaufwand:

Java:
interface BinaryOperation {
    Number perform(Number n1, Number n2);
}
Java:
class Subtraction implements BinaryOperation {
    public Number perform(Number n1, Number n2) {
        return n1.doubleValue() + n2.doubleValue();
    }
}
und dann die Map anlegen:
Java:
static Map<String, BinaryOperation> binaryOperations = new HashMap<>();
static {
    binaryOperations.put("-", new Subtraction());
    ...
}
und am Schluss dann noch:
Java:
    private String berechne() {
        BinaryOperation op = binaryOperations.get(comboBox.getValue());
        if (op != null) {
            return op.perform(Integer.parseInt(zahl1.getText()), Integer.parseInt(zahl2.getText()))
                    .toString();
        }
        return "";
    }
Das wird dann teilweise ganz schön lang.
 
return n1.doubleValue() + n2.doubleValue();
ist zwar jetzt keine Subtraktion doch ich hab es verstanden, das wäre ja ein riesiger schreib aufwand und viele Klassen die man so gesehen auch nicht zwingen dermaßen benötigt! :D
Mir fehlt einfach die Übung.
Aber vielen lieben Dank nochmal für die Hilfe hier :)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben