Mit Objekten rechnen, Textfield, JavaFX, Noob

Diskutiere Mit Objekten rechnen, Textfield, JavaFX, Noob im Java Basics - Anfänger-Themen Bereich.
D

DerMustermann

Hallo zusammen
vorneweg: ich bin noch ein ziemlicher "noob" in Sachen programmieren.

Derzeit beschäftige ich mich mit JavaFX und habe dafür einen kleinen Rechner geschrieben (mehr oder weniger nach Anleitung)..
Java:
import javafx.application.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.scene.control.*;

public class Rechner extends Application {
    public static void main(String[] args) {
        launch(args);
    }
   
    @Override
    public void start(Stage stage) {
        Rechenoperation rechner = new Rechenoperation();
[B]// Soll genutzt werden! [/B]

       
       
        stage.setTitle("Rechner");
       
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setPadding(new Insets(5,5,5,5));
        grid.setHgap(5);
        grid.setVgap(5);
       
        Text titel = new Text("Number-Wizard");
        titel.setFont(Font.font("Arial",FontWeight.BOLD,25));
        grid.add(titel,0,0,1,1);
           
       
        Label beschriftung = new Label("Gib eine Zahl ein:");
        beschriftung.setFont(Font.font("Arial",FontWeight.BOLD,20));
        grid.add(beschriftung,0,1);
        TextField eingabeZahl = new TextField();
        grid.add(eingabeZahl,0,2);
       
        Label beschriftung2 = new Label("Ergebnis:");
        beschriftung2.setFont(Font.font("Arial",FontWeight.BOLD,20));
        grid.add(beschriftung2,0,3);
        TextField ergebnis = new TextField();
        grid.add(ergebnis,0,4);
       
        Button btn0 = new Button("Verdoppeln");
        grid.add(btn0,0,5);
       
        Button btn1 = new Button("Quadrat");
        grid.add(btn1,0,6);
       
        Button btn2 = new Button("Wurzel");
        grid.add(btn2,0,7);
   
        // Bis hier: "Oberfläche"
       
       
        btn0.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                ergebnis.setText("" + (2*Double.parseDouble(eingabeZahl.getText())));
            }
        });
       
        btn1.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                ergebnis.setText("" + (Double.parseDouble(eingabeZahl.getText())*Double.parseDouble(eingabeZahl.getText())));
            }
        });
       
        btn2.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                ergebnis.setText("" + (Math.sqrt(Double.parseDouble(eingabeZahl.getText()))));
            }
        });
        //Buttons
       
        Scene scene = new Scene(grid, 700,400);
        stage.setScene(scene);
        stage.show();
       
    }

}
Rechner.png

Das ganze erstellt ein kleines Fenster indem man eine Zahl eingeben kann, dann beim klick auf einen der Buttons eine Rechnung durchgeführt wird und dann ein Ergebnis ausgespuckt wird.

Nun würde ich gerne diese Rechenoperationen in eine eigene Klasse (rechner) auslagern. macht vermutlich keinen Sinn aber ich würds trotzdem gerne machen :)
Mein Problem: ich bekomme die eingaben im Textfield nicht richtig an meine Rechenmethoden übergeben und zurückgegeben. Ich habs mit String in Double umwandeln und andersrum versucht - klappt einfach nicht.

Das war zumindest meine Idee:
Irgendwie die Eingaben vom Textfield (eingabeZahl) in einer Double-Variable "speichern", diese an meine Rechenmethode übergeben und dann im Textfield (ergebnis) mein Ergebnis erhalten.
Ist schon der Ansatz falsch oder bin ich einfach zu doof um diesen auch umzusetzen?

Hoffe ihr konntet mir folgen :D Freu mich über jede Hilfe!
 
J

JustNobody

Also den Code
ergebnis.setText("" + (2*Double.parseDouble(eingabeZahl.getText())));

kannst Du Ersetzen durch:
ergebnis.setText("" + (rechner.verdopple(Double.parseDouble(eingabeZahl.getText()))));

Der Code umfasst ja eigentlich 4 Teile:
1. Den Wert aus dem Eingabefeld lesen
2. Den gelesenen Wert in ein Double umwandeln
3. Die Rechenoperation
4. Das Ergebnis setzen (Das sind eigentlich 2 Teile: a) in einen String umwandeln und b) das setzen des Ergebnisses)

Und es geht ja nur darum, den 3. Teil zu ersetzen:
2*... wird zu
rechner.verdopple(...)
so verdopple die Methode in Rechenoperation ist. Die Klasse kennen wir ja nicht.

Ansonsten ist das Unterteilen schon ein guter Schritt in die richtige Richtung. Das macht auf jeden Fall Sinn, sowas zu üben.
 
B

BestGoalkeeper

Tipp: Aufs Zahnrädchensymbol oben rechts klicken, [code=java][/code] schreiben und innerhalb der Tags den Code einfügen.
 
D

DerMustermann

Ich muss den Thread noch einmal wiederbeleben.

Hab mir heute noch mal den Code angeschaut und ein wenig dran rumgebastelt. Dabei ist mir aufgefallen, dass sobald ich die "" (in Action event handlern) lösche, der Code* nicht mehr funktioniert.
Also diese hier: ergebnis.setText("" + (2*Double.parseDouble(eingabeZahl.getText())));

Kann mir jemand erklären wieso das so ist?
Oder muss nach dem SetText ein Leerzeichen kommen?

*(Sowohl im "alten" als auch im "neuen" Code)
 
J

JustNobody

setText erwartet als Parameter einen String. Die Rechnung liefert aber ein double. Damit passt der Aufruf nicht.

Bei dem Zusammenfügen von Strings wird jedoch automatisch ein native Type (int, double, ...) in einen String umgewandelt bzw. es wird auf Referenztypen automatisch ein toString() aufgerufen.
Somit ist dieses "" + eine einfache Möglichkeit, einen String zu bekommen.

(Das ist so vorgesehen laut Java Language Specification 5.4: " and a string conversion (§5.1.11) of the non-String operand always occurs. " https://docs.oracle.com/javase/specs/jls/se14/html/jls-5.html#jls-5.4)
 
D

DerMustermann

Darauf wäre ich nie von allein gekommen..
Kann man setText auch einen anderen Parameter vorgeben?
Also wie beim "Scanner" z.b.?

Wenn ich das noch richtig im Kopf habe ging das mit dem ja.
z.B.

int a;
Scanner eingabe = new Scanner(System.in);
a = eingabe.nextInt();
 
mrBrown

mrBrown

setText erwartet immer einen String, kannst das aber auch zB mit String.valueOf lösen.
 
Thema: 

Mit Objekten rechnen, Textfield, JavaFX, Noob

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben