Bruchrechner

MaxG.

Bekanntes Mitglied
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
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();
    }
}

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);
    }
}

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;
   }
}

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 bearbeitet von einem Moderator:

VfL_Freak

Top Contributor
Moin,

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

Gruß Klaus

BTW: Umlaute in Bezeichnern sind keine gute Idee !
 

MaxG.

Bekanntes Mitglied
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?
 

VfL_Freak

Top Contributor
Moin,

Du meinst diesen Part?
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!
Java:
myTextField.setText( "" );
Gruß Klaus
 

Viktim

Bekanntes Mitglied
So hier mal ein kleines Beispiel:

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();
  }
}
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben