Bruch GUI

Sandro95

Bekanntes Mitglied
Einen guten abend leute ,
leider komem ich nicht weiter .. ich soll für ein Klasse Bruch eine GUI iplementieren siehe anhang
(mache es mit javaFX)
Ich habe als erstes es mit einem BorderPane versucht mit Hboxen und VBoxen doch kriege das nicht so schön hin .
Jetzt wollte ich es mit einer GridPane versuchen doch dies klappt iwie nicht da sich nur die ganze GridPane formatieren lässt aber nicht die einzelnen KinderElemente wie hier ZB das Label "Bruch 1 "

Java:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MainBruch extends Application {
    
    public void start(Stage primstage) {
        GridPane pane = new GridPane();       
        
//        BorderPane border = new BorderPane();
//       
//       
//        HBox hboxTop = new HBox();
//        HBox hboxCenter = new HBox();
//       
//        VBox boxLeft = new VBox();
//        VBox boxRight = new VBox();
//       
//        border.setTop(hboxTop);
//        border.setLeft(boxLeft);
//        border.setCenter(hboxCenter);
//       
        Label label1 = new Label("Bruchrechnen");
        Label bruch1 = new Label("Bruch 1");
//        Label bruch2 = new Label("Bruch 2");
//       
//        TextField zaehlerEins = new TextField();
//        TextField nennerEins = new TextField();
//        TextField zaehlerZwei = new TextField();
//        TextField NennerZwei = new TextField();
//        TextField zaehlerEerg = new TextField();
//        TextField nennerErg = new TextField();
//
//       
//        hboxTop.setAlignment(Pos.CENTER);
//        hboxTop.setPadding(new Insets(80,0,0,0));
//       
//        hboxCenter.setAlignment(Pos.TOP_CENTER);
//       
//       
//       
//        boxLeft.setAlignment(Pos.CENTER);
//        boxLeft.setPadding(new Insets(30));
//       
//       
//       
//       
//        hboxTop.getChildren().add(label1);   
//        boxLeft.getChildren().addAll(bruch1,zaehlerEins,nennerEins);
//        hboxCenter.getChildren().addAll(bruch2);
        pane.setAlignment(Pos.CENTER);
        pane.setPadding(new Insets(0,200,200,0));
        
        pane.add(label1, 2,0);
        pane.add(bruch1, 0,1);
        
        
        Scene szene = new Scene(pane,400,400);
        primstage.setScene(szene);
        primstage.setTitle("Bruchrechnen_GUI");
        primstage.show();
        
        
        
        
    }

    public static void main(String[] args) {
        
        launch();
 

Anhänge

  • WhatsApp Image 2020-12-21 at 17.12.15.jpeg
    WhatsApp Image 2020-12-21 at 17.12.15.jpeg
    76,2 KB · Aufrufe: 38

Sandro95

Bekanntes Mitglied
Vielleicht ist ja das hier was für dich:
leider nicht wirklich , habs jetzt mit einer BorderPane gelöst sieht zwar anders aus als das Bild im anhang aber naja
 

lam_tr

Top Contributor
GUI.PNG

Hier eine kleine Annäherung. Ich will jetzt nicht deine Hausaufgabe machen, aber mit Hilfe von Controlbaum kannst du bestimmt es nachbauen

Ich kann auch helfen wenn du irgendwo nicht weiterkommst.

Grüße
lam
 

Anhänge

  • GUI1.PNG
    GUI1.PNG
    14,5 KB · Aufrufe: 31
K

kneitzel

Gast
Wobei man sowas zur Not auch einfach mit dem SceneBuilder zusammen ziehen. Das mag keine ideale Lösung sein, aber es ist etwas, das in wenigen Minuten fertig ist....
 
K

kneitzel

Gast
Habe ich vor 25 Minuten in ca. 3 min zusammengeklickt :)
Ja, mit etwas Erfahrung ist das eine einfache, schnelle Sache. :)

Aber wenn man mit den Containern noch nicht viel gemacht hat, dann wird das etwas viel ....

Die Frage ist halt, was die Zielsetzung ist ... für eine erste GUI halte ich es für etwas übertrieben / zu viel. Aber wenn man die Entwicklung von Oberflächen vertiefen will, dann würde ich da auf jeden Fall entsprechend mehr vertiefen. Aber da gehört dann noch deutlich mehr dazu, als nur: so soll es aussehen. Wie soll es sich z.B. verhalten, wenn die Fenstergröße verändert wird? Das bestimmt ja auch den Aufbau / die verwendeten Panes.
 

lam_tr

Top Contributor
Ja, mit etwas Erfahrung ist das eine einfache, schnelle Sache. :)

Aber wenn man mit den Containern noch nicht viel gemacht hat, dann wird das etwas viel ....

Die Frage ist halt, was die Zielsetzung ist ... für eine erste GUI halte ich es für etwas übertrieben / zu viel. Aber wenn man die Entwicklung von Oberflächen vertiefen will, dann würde ich da auf jeden Fall entsprechend mehr vertiefen. Aber da gehört dann noch deutlich mehr dazu, als nur: so soll es aussehen. Wie soll es sich z.B. verhalten, wenn die Fenstergröße verändert wird? Das bestimmt ja auch den Aufbau / die verwendeten Panes.
Wir reden hier gerade nur von Darstellung, aber sobald es wirklich tiefer geht mit MVVP, Controller, Verhalten und so weiter, dann würde ich ihm dann zu deiner guten Seite weiterleiten.

Und ja du hast recht, Layout Manager ist an sich schon eine komplexe Sache, ich muss mich immer wieder wenn ich etwas neues anfange, voll viel experiementieren bis ich das verstehe. Letztens habe ich zum Beispiel Flutter angeschaut, da musste ich von Grund auf neu anfangen. Und bei sowas finde ich ein Visual Designer immer sehr praktisch und hilfreich, da man die einzelne Attribute nochmal verdeutlichen kann.
 

lam_tr

Top Contributor
Wir reden hier gerade nur von Darstellung, aber sobald es wirklich tiefer geht mit MVVP, Controller, Verhalten und so weiter, dann würde ich ihm dann zu deiner guten Seite weiterleiten.

Und ja du hast recht, Layout Manager ist an sich schon eine komplexe Sache, ich muss mich immer wieder wenn ich etwas neues anfange, voll viel experiementieren bis ich das verstehe. Letztens habe ich zum Beispiel Flutter angeschaut, da musste ich von Grund auf neu anfangen. Und bei sowas finde ich ein Visual Designer immer sehr praktisch und hilfreich, da man die einzelne Attribute nochmal verdeutlichen kann.

Wir reden hier gerade nur von Darstellung, aber sobald es wirklich tiefer geht mit MVVP, Controller, Verhalten und so weiter, dann würde ich ihm dann zu deiner guten Seite weiterleiten.
Beim zweiten mal durchlesen hört sich dieser Satz etwas ironisch an. @kneitzel das habe ich so nicht gemeint. nacheditieren geht leider auch nicht mehr.
 
K

kneitzel

Gast
So hatte ich es nicht verstanden, wobei ich selbst bei der ironischen Bedeutung nicht böse wäre ... Ich bin ja auch noch etwas in der Findngs-Phase. Ich habe einiges ausprobiert und bin noch immer etwas am überlegen, wie ich das alles am Besten rüber bringen kann...
 

Sandro95

Bekanntes Mitglied
erstmal einen lieben dank an euch :)! @lam_tr @kneitzel
Habe die GUI jetzt etwas anders gemacht was aber okay ist .. nun habe ich ein anderes Problem und zwar sollen beim klicken der Button die jeweiligen Operationen durch geführt werden . ich kriege die werte der TextFelder aber nicht meinerm setZaehler() etc zugeordenter.. ich schick euch mal meine klassen und mein code vlr könnt ihr mir ja behiflich sein .. Morgen abend um 18 uhr ist abgabe und ich versuche es schon seit stunden...
Java:
public class Bruch {

    private int zaehler;
    private int nenner;

    public Bruch(int zaehler, int nenner) {

        if (nenner == 0) {
            System.out.println("Der Nenner darf nicht 0 sein");
        }
        this.zaehler = zaehler;
        this.nenner = nenner;
    }
    
    public Bruch() {
        
    }

    public void setZaehler(int zaehler) {
        this.zaehler = zaehler;

    }

    public void setNenner(int nenner) {
        this.nenner = nenner;
    }

    public int getZehler() {
        return this.zaehler;
    }

    public int getNenner() {
        return this.nenner;
    }

    public String toString() {
        return this.zaehler + " / " + this.nenner;
    }

    public void erweiternUm(int b) {

        if (b != 0) {
            zaehler = zaehler * b;
            nenner = nenner * b;
        }
        if (nenner < 0) {
            zaehler = -zaehler;
            nenner = -nenner;
        }

    }

    public double getDezimalwert() {
        return ((double) this.zaehler) / this.nenner;

    }

    private int ggT(int a, int b) {
        a = zaehler;
        b = nenner;
        int h;
        while (b != 0) {
            h = a % b;
            a = b;
            b = h;
        }
        return a;
    }

    public void kuerzen() {

        if (nenner < 0) {
            zaehler = -zaehler;
            nenner = -nenner;
        }

        int x = ggT(zaehler, nenner);
        zaehler = zaehler / x;
        nenner = nenner / x;
    }
    public void kuerzenUm(int x) {
        
        if(x==0) {
            System.out.println("es darf nicht durch 0 gekürzt werden");
            return;
        }
        
        
        zaehler=zaehler/x;
        nenner=nenner/x;

    }
    
    public void kehrbruch() {
        int zwischen=zaehler;
        zaehler=nenner;
        nenner=zwischen;
        
    }

}



import javafx.scene.control.TextField;

public class NumberTextField extends TextField {

    @Override
    public void replaceText(int start, int end, String text) {
        if (validate(text)) {
            super.replaceText(start, end, text);
        }
    }

    @Override
    public void replaceSelection(String text) {
        if (validate(text)) {
            super.replaceSelection(text);
        }
    }

    private boolean validate(String text) {
        return ("".equals(text) || text.matches("[0-9]"));
    }
  
}




import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MainBruch extends Application {
    
    public void start(Stage primstage) {
        
        BorderPane border = new BorderPane();
        
        
        HBox hboxTop = new HBox();
        VBox hboxCenter = new VBox();
        HBox boxBottom = new HBox();
        
        VBox boxLeft = new VBox();
        VBox boxRight = new VBox();
        
        border.setTop(hboxTop);
        border.setLeft(boxLeft);
        border.setCenter(hboxCenter);
        border.setRight(boxRight);
        border.setBottom(boxBottom);
        
        Label label1 = new Label("Bruchrechnen");
        Label bruch1 = new Label("Bruch 1");
        Label bruch2 = new Label("Bruch 2");
        Label erg = new Label("Ergebnis");
        Label dezi = new Label("Dezimalwert");
        
        NumberTextField zaehlerEins = new NumberTextField();
        NumberTextField nennerEins = new NumberTextField();
        NumberTextField zaehlerZwei = new NumberTextField();
        NumberTextField nennerZwei = new NumberTextField();
        NumberTextField zaehlerErg = new NumberTextField();
        NumberTextField nennerErg = new NumberTextField();
        NumberTextField ergT = new NumberTextField();
        
        Button plus = new Button("+");
        Button minus = new Button("-");
        Button mal = new Button("*");
        Button geteilt = new Button("/");


        
        hboxTop.setAlignment(Pos.CENTER);
        hboxTop.setPadding(new Insets(80,0,0,0));   
        
        
        hboxCenter.setAlignment(Pos.TOP_CENTER);
        hboxCenter.setPadding(new Insets(115,100,0,50));
        
        erg.setPadding(new Insets(0,20,0,0));
        dezi.setPadding(new Insets(20,20,0,0));
        
        boxLeft.setAlignment(Pos.CENTER);
        boxLeft.setPadding(new Insets(80,100,0,10));
        
            
        boxRight.setAlignment(Pos.BASELINE_RIGHT);
        boxRight.setPadding(new Insets(115,10,0,0));
        
        boxBottom.setAlignment(Pos.CENTER);
        boxBottom.setPadding(new Insets(0,0,50,0));
        boxBottom.setSpacing(10);       
        

        boxBottom.getChildren().addAll(plus,minus,mal,geteilt);
        hboxTop.getChildren().add(label1);   
        boxLeft.getChildren().addAll(bruch1,zaehlerEins,nennerEins);
        hboxCenter.getChildren().addAll(bruch2,zaehlerZwei,nennerZwei);
        boxRight.getChildren().addAll(erg,zaehlerErg,nennerErg,dezi,ergT);
        

        
        
        Scene szene = new Scene(border,400,400);
        primstage.setScene(szene);
        primstage.setTitle("Bruchrechnen_GUI");
        primstage.show();
        
        plus.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent e) {
                Bruch eins = new Bruch();
                eins.setZaehler(zaehlerEins);       
                System.out.println(zaehlerEins.getText() + " / " + nennerEins.getText());
                System.out.println(zaehlerZwei.getText() + " / "+ nennerZwei.getText());
//                TextField nennerEins = new TextField();
//                TextField zaehlerZwei = new TextField();
//                TextField nennerZwei = new TextField();
//                TextField zaehlerErg = new TextField();
//                TextField nennerErg = new TextField();
//                TextField ergT = new TextField();
                
            }
            
            
        });
        
        
        
        
    }

    public static void main(String[] args) {
        
        launch();
 

lam_tr

Top Contributor
Du muss die Eingabe als Integer parsen und als Zaehler setzen.

So etwa
Java:
eins.setZaehler(Integer.parseInt(zaehlerEins.getText()));
 

Sandro95

Bekanntes Mitglied
Der Nenner muss du auf gleiche Weise setzen.

Was an der Stelle gefährlich ist, wenn nicht alle Textfelder gefüllt sind, sollte die Buttons in der Mitte nicht aktiv sein. Sonst gibt es ein Null Pointer Exception.
ja genau , ich mache das jetzt für bruch eins dann erstelle ich ein objekt von bruch zwei und mache das selbe .

sobald ich dies getan habe kann ich dann dich für den plus button eins.erweiternUm(int) aufrufen ? ich verstehe aber nicht ganz , dsa sind alle Methoden die wir implementieren sollen , doch die erweiternUm ist doch keine Methode die zwei brüche zsm addiert ?
 

Sandro95

Bekanntes Mitglied
Der Nenner muss du auf gleiche Weise setzen.

Was an der Stelle gefährlich ist, wenn nicht alle Textfelder gefüllt sind, sollte die Buttons in der Mitte nicht aktiv sein. Sonst gibt es ein Null Pointer Exception.
hier Zb so jetzt muss ich diese addieren

Java:
plus.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent e) {
                Bruch eins = new Bruch();
                Bruch zwei = new Bruch();
                eins.setZaehler(Integer.parseInt(zaehlerEins.getText()));
                eins.setNenner(Integer.parseInt(nennerEins.getText()));
                
                zwei.setZaehler(Integer.parseInt(zaehlerZwei.getText()));
                zwei.setNenner(Integer.parseInt(nennerZwei.getText()));
                System.out.println(eins);
 

lam_tr

Top Contributor
hier Zb so jetzt muss ich diese addieren

Java:
plus.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent e) {
                Bruch eins = new Bruch();
                Bruch zwei = new Bruch();
                eins.setZaehler(Integer.parseInt(zaehlerEins.getText()));
                eins.setNenner(Integer.parseInt(nennerEins.getText()));
               
                zwei.setZaehler(Integer.parseInt(zaehlerZwei.getText()));
                zwei.setNenner(Integer.parseInt(nennerZwei.getText()));
                System.out.println(eins);
Joa du bist da schon auf dem guten Wege. Im Anschluss kannst du das Ergebnis n das Detimalwert textField übergeben
 

Sandro95

Bekanntes Mitglied
Joa du bist da schon auf dem guten Wege. Im Anschluss kannst du das Ergebnis n das Detimalwert textField übergeben
Wäre dir echt mega dankbar ..
Joa du bist da schon auf dem guten Wege. Im Anschluss kannst du das Ergebnis n das Detimalwert textField übergeben
also den dezi wert hab ic hauch übergeben bekommen , aber iwie erweitert das nicht richtig kommt oft ein falsches ergebnis


Java:
            @Override
            public void handle(ActionEvent e) {
                Bruch eins = new Bruch();
                Bruch zwei = new Bruch();
                Bruch drei = new Bruch();
                eins.setZaehler(Integer.parseInt(zaehlerEins.getText()));
                eins.setNenner(Integer.parseInt(nennerEins.getText()));
                
                zwei.setZaehler(Integer.parseInt(zaehlerZwei.getText()));
                zwei.setNenner(Integer.parseInt(nennerZwei.getText()));
                
                eins.erweiternUm(4);
                ergT.setText(Double.toString(eins.getDezimalwert()));
                

                System.out.println(eins);
 

Sandro95

Bekanntes Mitglied
um welche zahl soll ich denn sonst erweitern , die methode erwartet einen einigen int , ich kann ja schlecht dort zB Zaehlerzwei übergeben denn ich bräuchte ja auch noch den NennerZwei als paramater @lam_tr
 
K

kneitzel

Gast
Du hast zwei Brüche und je nach gedrücktem Knopf wirst Du doch sagen können, was gemacht werden muss, oder?

Ok, die Klasse Bruch ist etwas limitiert, aber sie bietet doch alles, was man braucht.

Das ist ja jetzt einfache Mathematik:

Wenn also die Aufgabe ist: (z1/n1) + (z2/n2)
Dann sind die Schritte:
a) gleicher Nenner. Und das kann einfach n1 * n2 sein. Also ersten Bruch um n2 erweitern, zweiten um n1 erweitern.
b) Dann kann man die Zähler addieren.
==> (z1*n2 + z2*n1)/(n1*n2)
c) Ergebnis dann noch kürzen und anzeigen...

Bei - ist es ebenso, nur eben hast Du da natürlich: (z1*n2 - z2*n1)/(n1*n2)

* und / wirst Du hoffentlich selbst hin kriegen...
 

lam_tr

Top Contributor
Du hast zwei Brüche und je nach gedrücktem Knopf wirst Du doch sagen können, was gemacht werden muss, oder?

Ok, die Klasse Bruch ist etwas limitiert, aber sie bietet doch alles, was man braucht.

Das ist ja jetzt einfache Mathematik:

Wenn also die Aufgabe ist: (z1/n1) + (z2/n2)
Dann sind die Schritte:
a) gleicher Nenner. Und das kann einfach n1 * n2 sein. Also ersten Bruch um n2 erweitern, zweiten um n1 erweitern.
b) Dann kann man die Zähler addieren.
==> (z1*n2 + z2*n1)/(n1*n2)
c) Ergebnis dann noch kürzen und anzeigen...

Bei - ist es ebenso, nur eben hast Du da natürlich: (z1*n2 - z2*n1)/(n1*n2)

* und / wirst Du hoffentlich selbst hin kriegen...
Das macht mehr Sinn ja
 

Sandro95

Bekanntes Mitglied
Du hast zwei Brüche und je nach gedrücktem Knopf wirst Du doch sagen können, was gemacht werden muss, oder?

Ok, die Klasse Bruch ist etwas limitiert, aber sie bietet doch alles, was man braucht.

Das ist ja jetzt einfache Mathematik:

Wenn also die Aufgabe ist: (z1/n1) + (z2/n2)
Dann sind die Schritte:
a) gleicher Nenner. Und das kann einfach n1 * n2 sein. Also ersten Bruch um n2 erweitern, zweiten um n1 erweitern.
b) Dann kann man die Zähler addieren.
==> (z1*n2 + z2*n1)/(n1*n2)
c) Ergebnis dann noch kürzen und anzeigen...

Bei - ist es ebenso, nur eben hast Du da natürlich: (z1*n2 - z2*n1)/(n1*n2)

* und / wirst Du hoffentlich selbst hin kriegen...
ja die methoden aus der klasse bruch irritieren mich , die bringen mich nich tweiter ..
also beim addieren wie hier im fall implementiere ich die ganze addition einfach in meinem eventhandler plus.setOnActio ?

das selbe mache ich dann für die 3 anderen fälle ?
 
K

kneitzel

Gast
Dann lieber eine helper Klasse die vier Grund Operation für Brüche anbietet.
Also ich bin kein Freund von diesen Helper Klassen. Das gehört für mich ganz klar in die Klasse Bruch. Wenn also irgendwie möglich, würde ich die Klasse Bruch eben um die Grundrechenarten erweitern.

Wenn man über das Design spricht, dann würde ich auch die Settern auswerfen, aber das ist ein anderes Thema. (@Sandro95 Das ignorierst Du besser. Da geht es etwas tiefer in die Design Frage. Die Idee, die ich da geäußert habe ist einfach, dass ein Bruch unveränderlich ist. Du erstellst also immer nur neue Brüche mit einem Konstruktor. Wenn Du dann hast bruch1.add(bruch2), dann sind bruch1 und bruch2 danach unverändert. Das Ergebnis wir danach zurück gegeben. Also so, wie Du es evtl. von der Klasse String her kennst.)

ja die methoden aus der klasse bruch irritieren mich , die bringen mich nich tweiter ..
also beim addieren wie hier im fall implementiere ich die ganze addition einfach in meinem eventhandler plus.setOnActio ?

das selbe mache ich dann für die 3 anderen fälle ?
Wieso irritieren Dich die Methoden? Du hast eine Hand voll Methoden die Du nutzen kannst. Du musst jetzt nur genug Mathe-Wissen haben, um damit etwas anfangen zu können. Ich habe Dir ja zu der Addition schon einen Weg aufgezeigt, wie Du dies berechnen kannst mit Hilfe der gegebenen Methoden.

Dies kannst Du in den Eventhandlern machen. Aber ich bin ein Freund, Business Logik und UI nicht zu vermischen. Die Grundrechenarten der Brüche sind ja Business Logik. Das sind ja Mathematische Regeln für Brüche. Die haben nichts mit der Oberfläche zu tun. Streng genommen ist es in meinen Augen eine Art Verhalten der Brüche. Daher gehört es in die Klasse Bruch rein.
Sollte dies die Aufgabe verbieten, dann so wie @lam_tr gesagt hat: Helper Klasse. Das bedeutet, dass Du eine weitere Klasse schreibst wie
Brueche, BruchHelfer, BruchUtil, ...
Und da hast Du dann Methoden wie:
public static Bruch add(Bruch bruch1, Bruch bruch2) { ... }

Andere Beispiele für dieses Pattern finden sich z.B. in der Klasse Arrays vom JDK oder StringUtils von diversen Libraries wie z.B. Apache Commons.
Aber wenn Du das Forum hier schon etwas mehr gelesen hast: Es wird oft gesagt: Static solle man weglassen und nur für public static void main und für Konstanten nutzen ... In diesem Fall halt einfach, weil der Code direkt in Bruch rein gehört.
 

Sandro95

Bekanntes Mitglied
Also ich bin kein Freund von diesen Helper Klassen. Das gehört für mich ganz klar in die Klasse Bruch. Wenn also irgendwie möglich, würde ich die Klasse Bruch eben um die Grundrechenarten erweitern.

Wenn man über das Design spricht, dann würde ich auch die Settern auswerfen, aber das ist ein anderes Thema. (@Sandro95 Das ignorierst Du besser. Da geht es etwas tiefer in die Design Frage. Die Idee, die ich da geäußert habe ist einfach, dass ein Bruch unveränderlich ist. Du erstellst also immer nur neue Brüche mit einem Konstruktor. Wenn Du dann hast bruch1.add(bruch2), dann sind bruch1 und bruch2 danach unverändert. Das Ergebnis wir danach zurück gegeben. Also so, wie Du es evtl. von der Klasse String her kennst.)


Wieso irritieren Dich die Methoden? Du hast eine Hand voll Methoden die Du nutzen kannst. Du musst jetzt nur genug Mathe-Wissen haben, um damit etwas anfangen zu können. Ich habe Dir ja zu der Addition schon einen Weg aufgezeigt, wie Du dies berechnen kannst mit Hilfe der gegebenen Methoden.

Dies kannst Du in den Eventhandlern machen. Aber ich bin ein Freund, Business Logik und UI nicht zu vermischen. Die Grundrechenarten der Brüche sind ja Business Logik. Das sind ja Mathematische Regeln für Brüche. Die haben nichts mit der Oberfläche zu tun. Streng genommen ist es in meinen Augen eine Art Verhalten der Brüche. Daher gehört es in die Klasse Bruch rein.
Sollte dies die Aufgabe verbieten, dann so wie @lam_tr gesagt hat: Helper Klasse. Das bedeutet, dass Du eine weitere Klasse schreibst wie
Brueche, BruchHelfer, BruchUtil, ...
Und da hast Du dann Methoden wie:
public static Bruch add(Bruch bruch1, Bruch bruch2) { ... }

Andere Beispiele für dieses Pattern finden sich z.B. in der Klasse Arrays vom JDK oder StringUtils von diversen Libraries wie z.B. Apache Commons.
Aber wenn Du das Forum hier schon etwas mehr gelesen hast: Es wird oft gesagt: Static solle man weglassen und nur für public static void main und für Konstanten nutzen ... In diesem Fall halt einfach, weil der Code direkt in Bruch rein gehört.
Ja für mich ist das auch viel besser die fachlogik und gui getrennt zu halten (3 schichten Modell) aber auf dem Blatt stehen ja für die Klasse Bruch nur die gegeben Methoden und keine die für die Addition etc zuständig ist deswegen meine frage wo ich diese Methoden genau implementieren soll wenn wir von dem Aufgsbenblatt ausgehen
 
K

kneitzel

Gast
Auf dem Aufgabenblatt ist erst einmal nur vorgegeben, was die Klasse Bruch bisher hat. Wenn die Klasse in Deinem Zugriff ist (Du hast eine Kopie und kannst diese verändern), dann würde ich diese verändern.

Wenn die Klasse nicht in Deinem direkten Zugriff ist, dann ist die Frage: Ist die Klasse final? Wenn nicht -> Leite deine eigene Klasse von Bruch ab und ergänze dann die Methoden.

Ist dies auch keine Lösung: Mach diesen Helper Ansatz.

Wenn aus irgend einem Grund das auch nicht möglich ist (Du kannst nur eine Datei einreichen mit der GUI, also nur eine Klasse ist möglich), dann kannst Du immer noch die Methoden so schreiben wie Du diese in einer Helper Klasse geschrieben hättest. (Die Möglichkeit einer inneren Klasse ignoriere ich hier einmal, den das würde zu weit gehen. Wäre aber auch interessant um ggf. ein schnelles Refactoring zu ermöglichen... Aber das ist ein Punkt, der bei so Aufgaben egal ist ...)
 

Sandro95

Bekanntes Mitglied
Auf dem Aufgabenblatt ist erst einmal nur vorgegeben, was die Klasse Bruch bisher hat. Wenn die Klasse in Deinem Zugriff ist (Du hast eine Kopie und kannst diese verändern), dann würde ich diese verändern.

Wenn die Klasse nicht in Deinem direkten Zugriff ist, dann ist die Frage: Ist die Klasse final? Wenn nicht -> Leite deine eigene Klasse von Bruch ab und ergänze dann die Methoden.

Ist dies auch keine Lösung: Mach diesen Helper Ansatz.

Wenn aus irgend einem Grund das auch nicht möglich ist (Du kannst nur eine Datei einreichen mit der GUI, also nur eine Klasse ist möglich), dann kannst Du immer noch die Methoden so schreiben wie Du diese in einer Helper Klasse geschrieben hättest. (Die Möglichkeit einer inneren Klasse ignoriere ich hier einmal, den das würde zu weit gehen. Wäre aber auch interessant um ggf. ein schnelles Refactoring zu ermöglichen... Aber das ist ein Punkt, der bei so Aufgaben egal ist ...)
Ich danke euch allen sehr ihr habt mir enorm geholfen ist nicht selbstverständlich!
Ich probiere es nachher mal :)
 

Sandro95

Bekanntes Mitglied
Auf dem Aufgabenblatt ist erst einmal nur vorgegeben, was die Klasse Bruch bisher hat. Wenn die Klasse in Deinem Zugriff ist (Du hast eine Kopie und kannst diese verändern), dann würde ich diese verändern.

Wenn die Klasse nicht in Deinem direkten Zugriff ist, dann ist die Frage: Ist die Klasse final? Wenn nicht -> Leite deine eigene Klasse von Bruch ab und ergänze dann die Methoden.

Ist dies auch keine Lösung: Mach diesen Helper Ansatz.

Wenn aus irgend einem Grund das auch nicht möglich ist (Du kannst nur eine Datei einreichen mit der GUI, also nur eine Klasse ist möglich), dann kannst Du immer noch die Methoden so schreiben wie Du diese in einer Helper Klasse geschrieben hättest. (Die Möglichkeit einer inneren Klasse ignoriere ich hier einmal, den das würde zu weit gehen. Wäre aber auch interessant um ggf. ein schnelles Refactoring zu ermöglichen... Aber das ist ein Punkt, der bei so Aufgaben egal ist ...)

so habe Zb die add methode implementiert ich habe die werte 1/4 und 2/8 übergeben und kriegeals erg 1/1 was aber falsch ist woran liegt das die rechnung ist doch richtig ?
und noch was , wie kriege ich dan ndas ergebnis des addieren zum ergebnis in der GUI ? mein neuer Bruch welcher erstellt wird ist ja nur in der Methode addieren ..

Meine ETxtfelder sidn wie folgt:


NumberTextField zaehlerEins = new NumberTextField();
NumberTextField nennerEins = new NumberTextField();
NumberTextField zaehlerZwei = new NumberTextField();
NumberTextField nennerZwei = new NumberTextField();
NumberTextField zaehlerErg = new NumberTextField();
NumberTextField nennerErg = new NumberTextField();
NumberTextField ergT = new NumberTextField();



Java:
 public Bruch addiere(Bruch b) {
            Bruch neuerBruch = new Bruch();
            int z = this.zaehler * b.nenner + b.zaehler * this.nenner;
            int n = this.nenner * b.nenner;
            neuerBruch.zaehler = z;
            neuerBruch.nenner = n;
            
            neuerBruch.kuerzen();

            return neuerBruch;
        }


        @Override
            public void handle(ActionEvent e) {
                Bruch eins = new Bruch();
                Bruch zwei = new Bruch();
                Bruch drei = new Bruch();
                eins.setZaehler(Integer.parseInt(zaehlerEins.getText()));
                eins.setNenner(Integer.parseInt(nennerEins.getText()));
                
                zwei.setZaehler(Integer.parseInt(zaehlerZwei.getText()));
                zwei.setNenner(Integer.parseInt(nennerZwei.getText()));
                
                System.out.println(eins.addiere(zwei));
 

Sandro95

Bekanntes Mitglied
also die add methode habe ich jetzt hibekommen nur das der Gui als ergebnis zu zordnen klappt iwie nicht ..


Java:
public class MainBruch extends Application {
    
    public void start(Stage primstage) {
        
        BorderPane border = new BorderPane();
        
        
        HBox hboxTop = new HBox();
        VBox hboxCenter = new VBox();
        HBox boxBottom = new HBox();
        
        VBox boxLeft = new VBox();
        VBox boxRight = new VBox();
        
        border.setTop(hboxTop);
        border.setLeft(boxLeft);
        border.setCenter(hboxCenter);
        border.setRight(boxRight);
        border.setBottom(boxBottom);
        
        Label label1 = new Label("Bruchrechnen");
        Label bruch1 = new Label("Bruch 1");
        Label bruch2 = new Label("Bruch 2");
        Label erg = new Label("Ergebnis");
        Label dezi = new Label("Dezimalwert");
        
        NumberTextField zaehlerEins = new NumberTextField();
        NumberTextField nennerEins = new NumberTextField();
        NumberTextField zaehlerZwei = new NumberTextField();
        NumberTextField nennerZwei = new NumberTextField();
        NumberTextField zaehlerErg = new NumberTextField();
        NumberTextField nennerErg = new NumberTextField();
        NumberTextField ergT = new NumberTextField();
    
        
        Button plus = new Button("+");
        Button minus = new Button("-");
        Button mal = new Button("*");
        Button geteilt = new Button("/");


        
        hboxTop.setAlignment(Pos.CENTER);
        hboxTop.setPadding(new Insets(80,0,0,0));   
        
        
        hboxCenter.setAlignment(Pos.TOP_CENTER);
        hboxCenter.setPadding(new Insets(115,100,0,50));
        
        erg.setPadding(new Insets(0,20,0,0));
        dezi.setPadding(new Insets(20,20,0,0));
        
        boxLeft.setAlignment(Pos.CENTER);
        boxLeft.setPadding(new Insets(80,100,0,10));
        
            
        boxRight.setAlignment(Pos.BASELINE_RIGHT);
        boxRight.setPadding(new Insets(115,10,0,0));
        
        boxBottom.setAlignment(Pos.CENTER);
        boxBottom.setPadding(new Insets(0,0,50,0));
        boxBottom.setSpacing(10);       
        

        boxBottom.getChildren().addAll(plus,minus,mal,geteilt);
        hboxTop.getChildren().add(label1);   
        boxLeft.getChildren().addAll(bruch1,zaehlerEins,nennerEins);
        hboxCenter.getChildren().addAll(bruch2,zaehlerZwei,nennerZwei);
        boxRight.getChildren().addAll(erg,zaehlerErg,nennerErg,dezi,ergT);
        

        
        
        Scene szene = new Scene(border,400,400);
        primstage.setScene(szene);
        primstage.setTitle("Bruchrechnen_GUI");
        primstage.show();
        
        plus.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent e) {
                Bruch eins = new Bruch();
                Bruch zwei = new Bruch();
                Bruch drei = new Bruch();
                eins.setZaehler(Integer.parseInt(zaehlerEins.getText()));
                eins.setNenner(Integer.parseInt(nennerEins.getText()));
                
                zwei.setZaehler(Integer.parseInt(zaehlerZwei.getText()));
                zwei.setNenner(Integer.parseInt(nennerZwei.getText()));
                
                System.out.println(drei.addiere(eins,zwei));
                drei.setZaehler(Integer.parseInt(zaehlerErg.getText()));
                drei.setNenner(Integer.parseInt(nennerErg.getText()));
 

Sandro95

Bekanntes Mitglied
du muss in dem Fall
Java:
ergT.setText(drei.addiere(eins,zwei))
machen.
du muss in dem Fall
Java:
ergT.setText(drei.addiere(eins,zwei))
machen.
klappt leider nicht , folgende fehlermeldung : The method setText(String) in the TextInputControl is not applicable for bruch

was soll ich jetzt machen ? casten ?
 
K

kneitzel

Gast
Du rechnest doch mit drei.addiere(eins,zwei) ein Ergebnis-Bruch aus. Speicher den doch in einer Variablen um dann die Werte des Ergebnisses überall zu setzen, wo Du es brauchst.
 

Sandro95

Bekanntes Mitglied
also erstelle ich in der klasse Bruch eine globale Variable wo ich dann den Bruch , mein ergbnis abspeichere ? wenn ich dann das ergebis abspeichere ist da ja eine zahl aber ergebnis GUI besteht ja aus zwei Textfelder wie soll ich das dann zu ordnen ? Zb ist das erg 1/3 dieses muss ich dann im textfeld zaehlerErg und nennerErg speichern
Du rechnest doch mit drei.addiere(eins,zwei) ein Ergebnis-Bruch aus. Speicher den doch in einer Variablen um dann die Werte des Ergebnisses überall zu setzen, wo Du es brauchst.
 
K

kneitzel

Gast
Nein, Wozu denn eine globale Variable?
Derzeit hast Du etwas wie:
Java:
ergT.setText(drei.addiere(eins,zwei))
Also scheint ja drei.addiere(eins,zwei) ein ergebnis zu liefern, das Du benötigst und das hoffentlich vom Typ Bruch ist ... Den ganzen Code kennen wir ja nicht ....

So wie Du ergT.setText aufgerufen hast, musst Du auch den Inhalt der anderen Controls setzen. Das kannst Du alles mit dem Code drei.addiere(eins,zwei) machen, aber es ist ja unsinnig, etwas mehrfach auszurechnen. Da Du das Ergebnis mehrfach brauchst, kannst Du es in einer lokalen Variable zwischen speichern. Und die kannst Du dann in den Aufrufen nutzen um Werte zu setzen..
 

Sandro95

Bekanntes Mitglied
ja ist von Typ Bruch :)
Das erg ist ja ein Bruch zB 1/3 dieses erg muss ich aber in zwei Textfelder zaehlerErg und nennerErg zu ordnen , wie soll ich das machen ist meine Frage ?
Wenn ich das erg zaehlerErg zuordne steht ja der ganze bruch im zaehler drin und der nenner ist leer ...
Nein, Wozu denn eine globale Variable?
Derzeit hast Du etwas wie:
Java:
ergT.setText(drei.addiere(eins,zwei))
Also scheint ja drei.addiere(eins,zwei) ein ergebnis zu liefern, das Du benötigst und das hoffentlich vom Typ Bruch ist ... Den ganzen Code kennen wir ja nicht ....

So wie Du ergT.setText aufgerufen hast, musst Du auch den Inhalt der anderen Controls setzen. Das kannst Du alles mit dem Code drei.addiere(eins,zwei) machen, aber es ist ja unsinnig, etwas mehrfach auszurechnen. Da Du das Ergebnis mehrfach brauchst, kannst Du es in einer lokalen Variable zwischen speichern. Und die kannst Du dann in den Aufrufen nutzen um Werte zu setzen..
 
K

kneitzel

Gast
Dann schau Dir Deine Klasse Bruch doch einmal an...

Wenn Du doch einen Bruch hast:
Kommst Du dann irgendwie an den Zähler? Und an den Nenner? Und was Du ggf. sonst noch so brauchst?

Und du hast Controls, in denen Du den angezeigten Text verändern willst: Hast Du da evtl. irgendwelche Methoden / Möglichkeiten?
 

Sandro95

Bekanntes Mitglied
ja mit den gettern komme ich an den zaehler und nenner .. aber wie genau mache ich das .. zuerst das erg in der klasse Bruch global abspeichern , dann die abgespeicherte variable der.setNenner(Integer.parseInt(ergZaehler.getTExt())); etc ?
 
K

kneitzel

Gast
Also das solltest Du doch hin kriegen:
- Wie deklarierst Du eine neue lokale Variable vom Typ Bruch? (Du hast z.B. in der Methode start von MainBruch viele lokale Variablen ... da kannst Du das erkennen....)
- Wie kannst Du dieser Variable das Ergebnis eines Aufrufs zuweisen?

Dann solltest Du genau überlegen: Was genau willst Du machen? Du hast eine Variable mit dem Ergebnis. Willst Du da noch Nenner oder Zaehler verändern? (Das wären set-Methoden). Oder willst Du die Daten lediglich auslesen (get-Methoden nutzen)?

Und was genau willst Du machen? Du willst diese Ergebnisse doch anzeigen. Wie zeigst Du etwas in einem Control an? Da wäre dann im Control doch etwas zu setzen -> Setter zu nutzen. Da hat @lam_tr in #38 ja schon etwas Code zu gezeigt ....

Im Augenblick hast Du alle Bauteile. Da verstehe ich gerade nicht, wo die Blockade bei Dir ist....
 

Sandro95

Bekanntes Mitglied
glaube meine blockade ist das ich seit sehr langen da dran sitze und heute abend abgabe ist .. dieser druck wahrscheinlich


Also das solltest Du doch hin kriegen:
- Wie deklarierst Du eine neue lokale Variable vom Typ Bruch? (Du hast z.B. in der Methode start von MainBruch viele lokale Variablen ... da kannst Du das erkennen....)
- Wie kannst Du dieser Variable das Ergebnis eines Aufrufs zuweisen?

Dann solltest Du genau überlegen: Was genau willst Du machen? Du hast eine Variable mit dem Ergebnis. Willst Du da noch Nenner oder Zaehler verändern? (Das wären set-Methoden). Oder willst Du die Daten lediglich auslesen (get-Methoden nutzen)?

Und was genau willst Du machen? Du willst diese Ergebnisse doch anzeigen. Wie zeigst Du etwas in einem Control an? Da wäre dann im Control doch etwas zu setzen -> Setter zu nutzen. Da hat @lam_tr in #38 ja schon etwas Code zu gezeigt ....

Im Augenblick hast Du alle Bauteile. Da verstehe ich gerade nicht, wo die Blockade bei Dir ist....
 
K

kneitzel

Gast
glaube meine blockade ist das ich seit sehr langen da dran sitze und heute abend abgabe ist .. dieser druck wahrscheinlich
Dann versuche es doch wirklich einmal wirklich nur jeden einzelnen Punkt für sich zu nehmen....

Also
a) Wie deklarierst Du eine lokale Variable vom Typ Bruch in Methode?

Wenn Du die hast:
b) Weise der Variablen das Ergebnis der Rechnung zu.

c) Welche Controls sollen welchen Wert bekommen? Das ist nur zu nennen, also hier will ich keinen Java Code sehen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Bruch Rechner AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben