Bruchrechner

Dieses Thema Bruchrechner im Forum "Allgemeine Java-Themen" wurde erstellt von MaxG., 9. Jan. 2017.

Thema: Bruchrechner Hi, ich möchte einen Bruchrechner programmieren meine Gui und die Logik für das Plus rechnen stehen schon. Ich hab...

  1. Hi,
    ich möchte einen Bruchrechner programmieren meine Gui und die Logik für das Plus rechnen stehen schon. Ich hab nur 2 Probleme. Problem 1: beim Löschen der Eingabe wird aus einem Textfeld nichts rausgelöscht, dazu meine Frage: Was habe ich da Falsch gemacht? Problem 2: beim plus rechnen mit 2 unterschiedlichen Nennern kommt die Fehlermeldung: java.lang.OutOfMemoryError, hierzu meine Frage Wie kommst dazu und wie kann ich es beheben??

    hier noch mein Code
    Code (Java):
    package RunProject;

    import Core.Listener;
    import Gui.MainFrame;

    public class ShowGui {

        public static void main(String[] args) {    
            MainFrame frame = new MainFrame();
            frame.showFrame();    
         
            Listener listener = new Listener(frame);
            listener.getAction();
        }
    }
    Code (Java):
    package Gui;

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.text.NumberFormat;

    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.border.Border;
    import javax.swing.text.NumberFormatter;

    public class MainFrame extends JFrame{

        public JPanel eingabeContainer;
        public JPanel eingabeController;
        public JPanel bruch1;
        public JPanel operator;
        public JPanel bruch2;
        public JPanel panelIstGleich;
        public JPanel ergebnis;
        public JPanel buttonsContainer;
        public JPanel operatoren;
        public JPanel panelClear;
     
        public JButton buttonPlus;
        public JButton buttonMinus;
        public JButton buttonMal;
        public JButton buttonGeteilt;
        public JButton buttonClear;
        public JButton buttonIstgleich;
     
        public JFormattedTextField zähler1;
        public JFormattedTextField nenner1;
        public JFormattedTextField zähler2;
        public JFormattedTextField nenner2;
        public JLabel zählerErgebnis;
        public JLabel nennerErgebnis;
     
        public JLabel operatorLabel;
        public JLabel labelIstGleich;
     
        public MainFrame(){
            this.setTitle("Bruchrechner");
            this.setSize(450,200);
            this.setLayout(new BorderLayout());
         
            NumberFormat format = NumberFormat.getInstance();
            format.setGroupingUsed(false);
            NumberFormatter formatter = new NumberFormatter(format);
            formatter.setAllowsInvalid(false);
         
            Border border = BorderFactory.createLineBorder(Color.BLACK, 1);
         
            eingabeContainer = new JPanel();
         
            eingabeController = new JPanel();
            eingabeController.setLayout(new GridLayout(1,5));
         
            bruch1 = new JPanel();
            bruch1.setLayout(new GridLayout(2,1,2,2));
         
            zähler1 = new JFormattedTextField(formatter);
            nenner1 = new JFormattedTextField(formatter);
            zähler1.setColumns(5);
            nenner1.setColumns(5);
            zähler1.setBorder(border);
            nenner1.setBorder(border);
         
            bruch1.add(zähler1);
            bruch1.add(nenner1);
         
         
            bruch2 = new JPanel();
            bruch2.setLayout(new GridLayout(2,1,2,2));
         
            zähler2 = new JFormattedTextField(formatter);
            nenner2 = new JFormattedTextField(formatter);
            zähler2.setColumns(5);
            nenner2.setColumns(5);
            zähler2.setBorder(border);
            nenner2.setBorder(border);
         
            bruch2.add(zähler2);
            bruch2.add(nenner2);
         
         
            operator = new JPanel();
         
            operatorLabel = new JLabel();
            operator.add(operatorLabel);
         
         
            panelIstGleich = new JPanel();
         
            labelIstGleich = new JLabel("=");
            panelIstGleich.add(labelIstGleich);
         
         
            ergebnis = new JPanel();
            ergebnis.setLayout(new GridLayout(2,1,2,2));
            nennerErgebnis = new JLabel();
            zählerErgebnis = new JLabel();
            nennerErgebnis.setBackground(Color.WHITE);
            nennerErgebnis.setOpaque(true);
            nennerErgebnis.setBorder(border);
            zählerErgebnis.setBackground(Color.WHITE);
            zählerErgebnis.setOpaque(true);
            zählerErgebnis.setBorder(border);
         
         
            ergebnis.add(zählerErgebnis);
            ergebnis.add(nennerErgebnis);
         
            eingabeController.add(bruch1);
            eingabeController.add(operator);
            eingabeController.add(bruch2);
            eingabeController.add(panelIstGleich);
            eingabeController.add(ergebnis);
         
            eingabeContainer.add(eingabeController);
         
            buttonsContainer = new JPanel();
         
            operatoren = new JPanel();
            operatoren.setLayout(new GridLayout(2,2,5,5));
         
            buttonPlus = new JButton("+");
            buttonMinus = new JButton("-");
            buttonMal = new JButton("*");
            buttonGeteilt = new JButton("/");
         
            operatoren.add(buttonPlus);
            operatoren.add(buttonMinus);
            operatoren.add(buttonMal);
            operatoren.add(buttonGeteilt);
         
            buttonsContainer.add(operatoren);
         
         
            panelClear = new JPanel();
         
            buttonClear = new JButton("C");
            buttonIstgleich = new JButton("=");
            panelClear.add(buttonClear);
            panelClear.add(buttonIstgleich);
         
            buttonsContainer.add(operatoren);
            buttonsContainer.add(panelClear);
         
            this.add(buttonsContainer, BorderLayout.SOUTH);
            this.add(eingabeContainer, BorderLayout.CENTER);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
     
        public void showFrame(){
            this.setVisible(true);
        }
    }
    Code (Java):
    package Core;

    import java.util.ArrayList;

    public class Rechner {

       ArrayList<Integer> zahlen = new ArrayList<Integer>();

       public ArrayList<Integer> plus(int nenner1, int zähler1, int nenner2, int zähler2) {
           int nenner, zähler;

           if(nenner1 == nenner2){
               zähler = zähler1 + zähler2;
               zahlen.add(nenner1);
               zahlen.add(zähler);
           }else{
               int counter = 1;
               double nenner1Rest, nenner2Rest;
               boolean statusNenner1 = false;
               boolean statusNenner2 = false;
               boolean next = false;

               do{
                   nenner1Rest = nenner1 % counter;
                   nenner2Rest = nenner2 % counter;

                   if(nenner1Rest == 0){
                       statusNenner1 = true;
                   }
                   if(nenner2Rest == 0){
                       statusNenner2 = true;
                   }

                   if(statusNenner1 == true && statusNenner2 == true){
                       int faktorNenner1, faktorNenner2, neuerZähler1, neuerZähler2, neuerNenner1;

                       neuerNenner1 = counter;

                       faktorNenner1 = counter / zähler1;
                       faktorNenner2 = counter / zähler2;

                       neuerZähler1 = faktorNenner1 * zähler1;
                       neuerZähler2 = faktorNenner2 * zähler2;

                       zähler = neuerZähler1 + neuerZähler2;

                       zahlen.add(neuerNenner1);
                       zahlen.add(zähler);
                   }else{
                       statusNenner1 = false;
                       statusNenner2 = false;
                   }
                   counter ++;
               }while(next == false);
           }
           return zahlen;
       }

       public ArrayList<Integer> minus(int nenner1, int zähler1, int nenner2, int zähler2) {
           return zahlen;
       }

       public ArrayList<Integer> mal(int nenner1, int zähler1, int nenner2, int zähler2) {
           return zahlen;
       }

       public ArrayList<Integer> geteilt(int nenner1, int zähler1, int nenner2, int zähler2) {
           return zahlen;
       }
    }
    Code (Java):
    package Core;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;

    import Gui.MainFrame;

    public class Listener<E> {

        MainFrame frame;
        Rechner rechner = new Rechner();

        int nenner1 = 0;
        int nenner2 = 0;
        int zähler1 = 0;
        int zähler2 = 0;
     
        ArrayList<Integer> zahlen;
     
        String nenner;
        String zähler;

        public Listener(MainFrame frame) {
            this.frame = frame;
        }

        public void getAction() {
            frame.buttonPlus.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    frame.operatorLabel.setText("+");
                }
            });

            frame.buttonMinus.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    frame.operatorLabel.setText("-");
                }
            });

            frame.buttonMal.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    frame.operatorLabel.setText("*");
                }
            });

            frame.buttonGeteilt.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    frame.operatorLabel.setText("/");
                }
            });

            frame.buttonIstgleich.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    String sOperator;
                    try {
                        nenner1 = Integer.parseInt(frame.nenner1.getText());
                    } catch (NumberFormatException e) {
                        System.err.println(
                                "Fehler bei Methode getAction in Klasse Listener Ursache: Fehler beim parsen von nenner1");
                    }

                    try {
                        nenner2 = Integer.parseInt(frame.nenner2.getText());
                    } catch (NumberFormatException e) {
                        System.err.println(
                                "Fehler bei Methode getAction in Klasse Listener Ursache: Fehler beim parsen von nenner2");
                    }

                    try {
                        zähler1 = Integer.parseInt(frame.zähler1.getText());
                    } catch (NumberFormatException e) {
                        System.err.println(
                                "Fehler bei Methode getAction in Klasse Listener Ursache: Fehler beim parsen von zähler1");
                    }

                    try {
                        zähler2 = Integer.parseInt(frame.zähler2.getText());
                    } catch (NumberFormatException e) {
                        System.err.println(
                                "Fehler bei Methode getAction in Klasse Listener Ursache: Fehler beim parsen von zähler2");
                    }
                    sOperator = frame.operatorLabel.getText();

                    if (sOperator.equals("+")) {
                        zahlen = (ArrayList<Integer>) rechner.plus(nenner1, zähler1, nenner2, zähler2);
                        nenner = String.valueOf(zahlen.get(0));
                        zähler = String.valueOf(zahlen.get(1));

                        frame.nennerErgebnis.setText(nenner);
                        frame.zählerErgebnis.setText(zähler);
                    }
                    if (sOperator.equals("-")) {
                        zahlen = (ArrayList<Integer>) rechner.minus(nenner1, zähler1, nenner2, zähler2);
                        nenner = String.valueOf(zahlen.get(0));
                        zähler = String.valueOf(zahlen.get(1));

                        frame.nennerErgebnis.setText(nenner);
                        frame.zählerErgebnis.setText(zähler);
                    }

                }
            });

            frame.buttonClear.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    frame.nenner1.setText(null);
                    frame.nenner2.setText(null);
                    frame.zähler1.setText(null);
                    frame.zähler2.setText(null);
                    frame.zählerErgebnis.setText(null);
                    frame.nennerErgebnis.setText(null);
                    frame.operatorLabel.setText(null);

                }
            });
        }
    }
     
    Zuletzt von einem Moderator bearbeitet: 10. Jan. 2017
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Moin,

    habe jetzt den Code nur überflogen, aber auffällig ist die Endlosschleife in der Methode plus :
    Code (Java):
    do{
    // ...
    }while( next == false );
    Du setzt next nie auf true !!

    Gruß Klaus

    BTW: Umlaute in Bezeichnern sind keine gute Idee !
     
  4. Danke ist mir überhaupt nicht aufgefallen
     
  5. Hat noch jemand eine Antwort zu meinem Anderen Problem.
    Problem: In dem Textfeld wo der Cursor drin ist wird wenn man den Button buttonClear drückt nichts rausgelöscht woran liegt das?
     
  6. Moin,

    Du meinst diesen Part?
    Code (Java):

    public void actionPerformed(ActionEvent arg0)
    {
        frame.nenner1.setText(null);
        frame.nenner2.setText(null);
        frame.zähler1.setText(null);
        frame.zähler2.setText(null);
        frame.zählerErgebnis.setText(null);
        frame.nennerErgebnis.setText(null);
        frame.operatorLabel.setText(null);
    }
     
    Ist Dir überhaupt klar, was null ist ?? :rolleyes:

    Ein Textfeld löscht Du ganz simpel, in dem Du einen leeren String zuweist!
    Code (Java):

    myTextField.setText( "" );
     
    Gruß Klaus
     
  7. Habs jetzt mit deinem Beispiel ausprobiert und der Bug ist immer noch da.
     
  8. hast Du denn auch ein "repaint()" ausgeführt ??
     
  9. Nein wie muss ich das Ausführen?
     
  10. :eek:

    frame.repaint() ??????????
     
  11. Habs jetzt mit .repaint() probiert und hat auch nicht funktioniert
     
  12. Moin,

    sorry, ich meinte eigentlich "revalidate" ...

    Gruß Klaus
     
  13. Habs auch mit .revalidate() probiert geht auch nicht.
     
  14. probier mal erst .repaint und dann .validate auf das Panel aufzurufen ;)
     
  15. So hier mal ein kleines Beispiel:

    Code (Java):
    import java.awt.Dimension;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;

    public class TEST extends JPanel {

      private final Dimension textfeldGroesse = new Dimension(100, 40);

      private JTextField nenner1;
      private JTextField nenner2;

      private JTextField zaehler1;
      private JTextField zaehler2;

      private JButton zuruecksetzen;

      public TEST() {
        setPreferredSize(new Dimension(800, 600));
        baueKomponenten();
        fuegeKomponentenHinzu();
        fuegeVerhaltenHinzu();
        baueFenster();

      }

      private void fuegeVerhaltenHinzu() {
        zuruecksetzen.addActionListener(e -> {
          nenner1.setText("");
          nenner2.setText("");
          zaehler1.setText("");
          zaehler2.setText("");
          repaint();
          validate();
        });
      }

      private void fuegeKomponentenHinzu() {
        add(nenner1);
        add(nenner2);
        add(zaehler1);
        add(zaehler2);
        add(zuruecksetzen);
      }

      private void baueKomponenten() {

        nenner1 = erstelleTextfeld(nenner1, "Nenner Eins");
        nenner2 = erstelleTextfeld(nenner2, "Nenner Zwei");
        zaehler1 = erstelleTextfeld(zaehler1, "Zähler Eins");
        zaehler2 = erstelleTextfeld(zaehler2, "Zähler Zwei");

        zuruecksetzen = new JButton("Zurücksetzten");
      }

      private JTextField erstelleTextfeld(JTextField textfeld, String text) {
        textfeld = new JTextField(text);
        textfeld.setPreferredSize(textfeldGroesse);
        return textfeld;
      }

      private void baueFenster() {
        JFrame frame = new JFrame("TEST FENSTER");
        frame.add(this);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }

      public static void main(String[] args) {
        new TEST();
      }
    }
     
     
  16. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!