Java Taschenrechner GUI

Ja, eine Lösung ergibt fünf neue Probleme. Ich habe vor anderthalb Jahren mit dem Programmieren angefangen, aber dieses Phänomen hält sich hartnäckig. Nicht aufgeben! :D

Gruß Jens
 
Ja ich weis bei uns auf Arbeit hängt ein Tolles Schild an der Tür von unsrem Programmierer:

99 little Bugs in the Code
Patch one out
199 little Bugs in the Code
 
Um den Eingabestring zu zerlegen, könnte man einen Parser verwenden (der die Eingabe auch gleich validiert).

Wäre für einen Anfänger natürlich ein ziemliches Unterfangen. Aber es gibt fertige Beispiele, die man einbinden könnte. Z.B. https://github.com/shmatov/antlr4-calculator für die Grundrechenarten (und Klammerung!).

Bei Swing sollte man übrigens die Threading-Regel beachten (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html). Um den Swing-Code in der main()-Methode gehört ein SwingUtilities.invokeLater().
 
Soo viel Google und überlegen haben eine Lösung zugrunde gebracht die rechnet ... allerdings keine längere aufgabe und da weis ich wieder nicht mehr weiter ...

1+1 = geht
10*10 =geht
1+1+1 = geht nicht (ausgabe = 2)

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.Hashtable;
import java.awt.font.TextAttribute;
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import Prog1Tools.IOTools;

/**
  *
  * Taschenrechner GUI
  *
  * version 1.0 vom 18.01.2018
  * Johannes Brauch 
  */

public class TaschenrechnerGUI extends JFrame {
  // Anfang Attribute
  private JTextArea TextArea1 = new JTextArea();
  private JLabel lTaschenrechner = new JLabel();
  private JButton eins = new JButton();
  private JButton zwei = new JButton();
  private JButton drei = new JButton();
  private JButton vier = new JButton();
  private JButton fuenf = new JButton();
  private JButton sechs = new JButton();
  private JButton sieben = new JButton();
  private JButton acht = new JButton();
  private JButton neun = new JButton();
  private JButton mal = new JButton();
  private JButton plus = new JButton();
  private JButton minus = new JButton();
  private JButton durch = new JButton();
  private JButton gleich = new JButton();
  private JButton zero = new JButton();
  private JLabel Ausgabe = new JLabel();
  // Ende Attribute
  
  ScriptEngineManager mgr= new ScriptEngineManager();
  ScriptEngine engine= mgr.getEngineByName("JavaScript");
  String foo=("");
  
  public TaschenrechnerGUI() { 
    // Frame-Initialisierung
    super();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 279; 
    int frameHeight = 319;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setTitle("TaschenrechnerGUI");
    setResizable(true);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
    
    lTaschenrechner.setBounds(32, 0, 227, 27);
    lTaschenrechner.setText("Taschenrechner");
    Hashtable<TextAttribute, Object> lTaschenrechner_map = new Hashtable<TextAttribute, Object>();
    lTaschenrechner_map.put(TextAttribute.FAMILY, "Arial Black");
    lTaschenrechner_map.put(TextAttribute.SIZE, 22);
    lTaschenrechner_map.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
    lTaschenrechner.setFont(new Font(lTaschenrechner_map));
    lTaschenrechner.setForeground(Color.BLACK);
    lTaschenrechner.setOpaque(false);
    lTaschenrechner.setHorizontalAlignment(SwingConstants.CENTER);
    lTaschenrechner.setHorizontalTextPosition(SwingConstants.CENTER);
    cp.add(lTaschenrechner);
    eins.setBounds(8, 160, 33, 33);
    eins.setText("1");
    eins.setMargin(new Insets(2, 2, 2, 2));
    eins.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    eins_ActionPerformed(evt);
    }
    });
    cp.add(eins);
    zwei.setBounds(48, 160, 33, 33);
    zwei.setText("2");
    zwei.setMargin(new Insets(2, 2, 2, 2));
    zwei.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    zwei_ActionPerformed(evt);
    }
    });
    cp.add(zwei);
    drei.setBounds(88, 160, 33, 33);
    drei.setText("3");
    drei.setMargin(new Insets(2, 2, 2, 2));
    drei.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    drei_ActionPerformed(evt);
    }
    });
    cp.add(drei);
    vier.setBounds(8, 200, 33, 33);
    vier.setText("4");
    vier.setMargin(new Insets(2, 2, 2, 2));
    vier.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    vier_ActionPerformed(evt);
    }
    });
    cp.add(vier);
    fuenf.setBounds(48, 200, 33, 33);
    fuenf.setText("5");
    fuenf.setMargin(new Insets(2, 2, 2, 2));
    fuenf.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    fuenf_ActionPerformed(evt);
    }
    });
    cp.add(fuenf);
    sechs.setBounds(88, 200, 33, 33);
    sechs.setText("6");
    sechs.setMargin(new Insets(2, 2, 2, 2));
    sechs.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    sechs_ActionPerformed(evt);
    }
    });
    cp.add(sechs);
    sieben.setBounds(8, 240, 33, 33);
    sieben.setText("7");
    sieben.setMargin(new Insets(2, 2, 2, 2));
    sieben.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    sieben_ActionPerformed(evt);
    }
    });
    cp.add(sieben);
    acht.setBounds(48, 240, 33, 33);
    acht.setText("8");
    acht.setMargin(new Insets(2, 2, 2, 2));
    acht.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    acht_ActionPerformed(evt);
    }
    });
    cp.add(acht);
    neun.setBounds(88, 240, 33, 33);
    neun.setText("9");
    neun.setMargin(new Insets(2, 2, 2, 2));
    neun.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    neun_ActionPerformed(evt);
    }
    });
    cp.add(neun);
    mal.setBounds(136, 160, 33, 33);
    mal.setText("X");
    mal.setMargin(new Insets(2, 2, 2, 2));
    mal.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    mal_ActionPerformed(evt);
    }
    });
    cp.add(mal);
    plus.setBounds(136, 200, 33, 33);
    plus.setText("+");
    plus.setMargin(new Insets(2, 2, 2, 2));
    plus.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    plus_ActionPerformed(evt);
    }
    });
    cp.add(plus);
    minus.setBounds(136, 240, 33, 33);
    minus.setText("-");
    minus.setMargin(new Insets(2, 2, 2, 2));
    minus.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    minus_ActionPerformed(evt);
    }
    });
    cp.add(minus);
    durch.setBounds(136, 120, 33, 33);
    durch.setText("/");
    durch.setMargin(new Insets(2, 2, 2, 2));
    durch.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    durch_ActionPerformed(evt);
    }
    });
    cp.add(durch);
    gleich.setBounds(48, 120, 73, 33);
    gleich.setText("=");
    gleich.setMargin(new Insets(2, 2, 2, 2));
    gleich.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    gleich_ActionPerformed(evt);
    }
    });
    gleich.setForeground(Color.BLACK);
    cp.add(gleich);
    zero.setBounds(8, 120, 33, 33);
    zero.setText("0");
    zero.setMargin(new Insets(2, 2, 2, 2));
    zero.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
    zero_ActionPerformed(evt);
    }
    });
    zero.setForeground(Color.BLACK);
    cp.add(zero);
    Ausgabe.setBounds(8, 40, 299, 65);
    Ausgabe.setText("");
    Ausgabe.setForeground(Color.BLACK);
    Ausgabe.setFont(new Font("Arial", Font.BOLD, 28));
    cp.add(Ausgabe);
    // Ende Komponenten
    
    setVisible(true);
  } // end of public TaschenrechnerGUI
  
  // Anfang Methoden
  
  
  public static void main(String[] args) {
    try{
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());               // Windows Theme
    } catch(Exception e) {
    }
    new TaschenrechnerGUI();
    
    //ScriptEngineManager mgr= new ScriptEngineManager();
    //ScriptEngine engine= mgr.getEngineByName("JavaScript");
    //String foo=("0");
    //System.out.println(engine.eval(foo));
  } // end of main
  
  public void eins_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("1");
    Ausgabe.setText(foo);
  } // end of eins_ActionPerformed

  public void zwei_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("2");
    Ausgabe.setText(foo);
    
  } // end of zwei_ActionPerformed

  public void drei_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("3");
    Ausgabe.setText(foo);
    
  } // end of drei_ActionPerformed

  public void vier_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("4");
    Ausgabe.setText(foo);
    
  } // end of vier_ActionPerformed

  public void fuenf_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("5");
    Ausgabe.setText(foo);
    
  } // end of fuenf_ActionPerformed

  public void sechs_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("6");
    Ausgabe.setText(foo);
    
  } // end of sechs_ActionPerformed

  public void sieben_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("7");
    Ausgabe.setText(foo);
    
  } // end of sieben_ActionPerformed

  public void acht_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("8");
    Ausgabe.setText(foo);
    
  } // end of acht_ActionPerformed

  public void neun_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("9");
    Ausgabe.setText(foo);
    
  } // end of neun_ActionPerformed

  public void mal_ActionPerformed(ActionEvent evt) {
    foo = foo.concat(" * ");
    Ausgabe.setText(foo);
    
  } // end of mal_ActionPerformed

  public void plus_ActionPerformed(ActionEvent evt) {
    foo = foo.concat(" + ");
    Ausgabe.setText(foo);
    
  } // end of plus_ActionPerformed

  public void minus_ActionPerformed(ActionEvent evt) {
    foo = foo.concat(" - ");
    Ausgabe.setText(foo);
    
  } // end of minus_ActionPerformed

  public void durch_ActionPerformed(ActionEvent evt) {
    foo = foo.concat(" / ");
    Ausgabe.setText(foo);
    
  } // end of durch_ActionPerformed

  public void gleich_ActionPerformed(ActionEvent evt) {
    foo = foo.concat(" = ");
    Ausgabe.setText(foo);
    double ergebnis= 0;
    
    String[] parts = foo.split(" ");
    
    for (int i=0;i<parts.length; i++) {
      //+-/* operator
      String c_part = parts[i];
    
      if (c_part.equals("+")) {
        //System.out.println("Plus gefunden");
        ergebnis=  Double.parseDouble(parts[i-1]) + Double.parseDouble(parts[i+1]);
      } // end of if
      
      if (c_part.equals("-")) {
        //System.out.println("Minus gefunden");
        ergebnis=  Double.parseDouble(parts[i-1]) - Double.parseDouble(parts[i+1]);
      } // end of if
      
      if (c_part.equals("*")) {
        //System.out.println("Mal gefunden");
        ergebnis=  Double.parseDouble(parts[i-1]) * Double.parseDouble(parts[i+1]);
      } // end of if
      
      if (c_part.equals("/")) {
        //System.out.println("Durch gefunden");
        ergebnis=  Double.parseDouble(parts[i-1]) / Double.parseDouble(parts[i+1]);
      } // end of if
    

    } // end of for
     

    Ausgabe.setText(String.valueOf(ergebnis));
    
  } // end of gleich_ActionPerformed
    
    public void zero_ActionPerformed(ActionEvent evt) {
    foo = foo.concat("0");
  Ausgabe.setText(foo);
    
  } // end of zero_ActionPerformed

  // Ende Methoden
} // end of class TaschenrechnerGUI
 
Und dir ist auch klar, warum das Ergebnis falsch ist? Wenn nicht, hast du zu viel gegooglet/kopiert und zu wenig verstanden.
Es ist aber gewollt, dass der Rechner stur von links nach rechts rechnet? Oder kommt das mit der nächsten Version?

Außerdem google mal nach ActionCommand. Damit kannst du deinen Code um 1/3 reduzieren. Da kriegt man ja Augenkrebs von.
 
Ich würde mich erstmal mit Blatt und Papier hinsetzen und überlegen in welchen Schritten man eine simple mathematische Aufgabe logisch aufteilt. Und das versuchen in Code zu übersetzen.
Aktuell berücksichtigst du immer nur die Zahl vor und nach einem Rechenschritt und überschreibst das Ergebnis.
 
Zurück
Oben