Taschenrechner mit GUI Problem bei der Berechnung

Diskutiere Taschenrechner mit GUI Problem bei der Berechnung im Java Basics - Anfänger-Themen Bereich.
2

27Flo09

Hallo Zusammen,

Ich muss für die Schule einen Taschenrechner mit GUI programmieren. Die GUI ist soweit auch fertig ich kann auch Zahlen über Buttons eingeben und die werden mir im Display angezeigt. Mein Problem: wie bekomme ich es hin das eine Rechenoperation ausgeführt wird? Ich habe auch schon mehrere Beispiele gefunden nur schaffe ich es nicht das ganze ans laufen zu bekommen. Unser Lehrer ist da leider keine große Hilfe er sagt googlet einfach. Ich weiß auch nie ob das so richtig ist was ich bis her gemacht habe. Über einen Denkanstoß oder ein kurzes Beispiel würde ich freuen.
Vielen Dank schonmal im Vorraus



Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class GridBagLayoutExample implements ActionListener

{
    private static JButton display;

    static void addComponent( Container cont,

                            GridBagLayout gbl,
                            Component c,
                            int x, int y,
                            int width, int height,
                            double weightx, double weighty )

    {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5,5,5,5);             
    gbc.gridx = x; gbc.gridy = y;                   
    gbc.gridwidth = width; gbc.gridheight = height;   
    gbc.weightx = weightx; gbc.weighty = weighty;   
    gbl.setConstraints( c, gbc );
    cont.add( c );
    }

  public  GridBagLayoutExample ()

  {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    Container c = f.getContentPane();
    GridBagLayout gbl = new GridBagLayout();
    c.setLayout( gbl );

    f.setSize( 500, 600 );     
    f.setVisible( true );       


    display = new JButton("");
    display.setEnabled(false);

    JButton button0 = new JButton("0");
    JButton button1 = new JButton("1");
    JButton button2 = new JButton("2");
    JButton button3 = new JButton("3");
    JButton button4 = new JButton("4");
    JButton button5 = new JButton("5");
    JButton button6 = new JButton("6");
    JButton button7 = new JButton("7");
    JButton button8 = new JButton("8");
    JButton button9 = new JButton("9");
    JButton buttonplus = new JButton("+");
    JButton buttonminus = new JButton("-");
    JButton buttonmulty = new JButton("*");
    JButton buttondivi = new JButton("/");
    JButton buttongleich = new JButton("=");
    JButton buttonC = new JButton("C");
    JButton buttonleer = new JButton("leer");
    JButton buttonkommer = new JButton(",");
    JButton buttonvorzeichen = new JButton("+/-");

  

  

                                                                               x  y  w  h  wx wy

    addComponent( c, gbl, display,                         0, 0, 10,2, 0, 1 );
    addComponent( c, gbl, button7,                         0, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, button8,                         2, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, button9,                         4, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonC,                          6, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonleer,                      8, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, button4,                          0, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, button5,                          2, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, button6,                          4, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonmulty,                      6, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, buttondivi,                      8, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, button1,                          0, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, button2,                          2, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, button3,                          4, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonplus,                      6, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonminus,                      8, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, button0,                          0, 8, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonvorzeichen,              2, 8, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonkommer,                  4, 8, 2, 2, 1, 1 );
    addComponent( c, gbl, buttongleich,                  6, 8, 4, 2, 1, 1 );

    button0.addActionListener(this);
    button1.addActionListener(this);
    button2.addActionListener(this);
    button3.addActionListener(this);
    button4.addActionListener(this);
    button5.addActionListener(this);
    button6.addActionListener(this);
    button7.addActionListener(this);
    button8.addActionListener(this);
    button9.addActionListener(this);
    buttonkommer.addActionListener(this);
    buttonmulty.addActionListener(this);
    buttondivi.addActionListener(this);
    buttonplus.addActionListener(this);
    buttonminus.addActionListener(this);
    buttongleich.addActionListener(this);

 

      }
      public static void main( String[] args ) {   
          new  GridBagLayoutExample ();
      }

    

      @Override
      public void actionPerformed(ActionEvent event) {
          String input = event.getActionCommand();         
         display.setText(display.getText() + input);         
      }                             

}
 
MoxxiManagarm

MoxxiManagarm

Unser Lehrer ist da leider keine große Hilfe er sagt googlet einfach.
Eigentlich ist es die Beste Hilfe, denn so läuft es nun mal. Wenn wir etwas nicht wissen dann googlen wir es. Das bereitet dich optimal als Entwickler vor ;D

Bevor wir zum eigentlichen Thema kommen solltest du aber unbedingt deinen Code noch abändern.
1. Warum ist die Methode addComponent static? Bitte entferne das static keyword
2. 19 Buttons einzeln zu erstellen und zu ergänzen ist kein schöner Stil. Bitte versuche zumindest die Zahlen in einer Schleife zu erstellen
3. Warum ist dein Display auch ein JButton? Ein Display hat nur eine anzeigende Funktion, bitte denke hier über JLabel nach.
 
2

27Flo09

Danke für deine schnelle Antwort.
Ich habe das jetzt so abgeändert das die Button 0-9 über eine Schleife erstellt werden. Ich habe ein Array erstellt damit ich die Buttons wieder abfragen kann und die in mein Layout einfügen kann. Allerdings werden mir jetzt nur noch Button 7 und 8 angezeigt der Rest ist weg. Was mache ich falsch?
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GridBagLayoutExample implements ActionListener
{


    //Methode um GridBagConstraints-Objekt zu erstellen und Werte zuzuweisen
     void addComponent( Container cont,
                            GridBagLayout gbl,
                            Component c,
                            int x, int y,
                            int width, int height,
                            double weightx, double weighty )
    {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.fill = GridBagConstraints.BOTH;
    gbc.insets = new Insets(5,5,5,5);               // Abstand: oben, links, unten, rechts
    gbc.gridx = x; gbc.gridy = y;                    //Anfangssplaten- und Zeilennummern
    gbc.gridwidth = width; gbc.gridheight = height;    //Breite und Höhe des Feldes
    gbc.weightx = weightx; gbc.weighty = weighty;    //"Gewicht" der Spalte und Zeile (für Platzaufteilung der Spalten und Zeilen)
    gbl.setConstraints( c, gbc );
    cont.add( c );
    }

  public  GridBagLayoutExample ()
  {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    Container c = f.getContentPane();

    GridBagLayout gbl = new GridBagLayout();
    c.setLayout( gbl );
   
    f.setSize( 500, 600 );        //Bestimmt Fenstergröße
    f.setVisible( true );        //Fenster sichtbar machen

   
    JLabel display = new JLabel();
   
    JButton[] buttons = new JButton[10];
   
    for(int i = 0; i<9; i++){
    buttons[i] = new JButton(" "+i);
    }
   
    JButton buttonplus = new JButton("+");
    JButton buttonminus = new JButton("-");
    JButton buttonmulty = new JButton("*");
    JButton buttondivi = new JButton("/");
    JButton buttongleich = new JButton("=");
    JButton buttonC = new JButton("C");
    JButton buttonleer = new JButton("leer");
    JButton buttonkommer = new JButton(",");
    JButton buttonvorzeichen = new JButton("+/-");
   
   
    //Hinzufügen der Komponenten                                  x  y  w  h  wx wy
    addComponent( c, gbl, display,                             0, 0, 10, 2, 0, 1 );
    addComponent( c, gbl, buttons[7],                         0, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[8],                         2, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[9],                         4, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonC,                              6, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonleer,                          8, 2, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[4],                          0, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[5],                          2, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[6],                          4, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonmulty,                          6, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, buttondivi,                          8, 4, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[1],                          0, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[2],                          2, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[3],                          4, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonplus,                          6, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonminus,                          8, 6, 2, 2, 1, 1 );
    addComponent( c, gbl, buttons[0],                          0, 8, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonvorzeichen,                  2, 8, 2, 2, 1, 1 );
    addComponent( c, gbl, buttonkommer,                      4, 8, 2, 2, 1, 1 );
    addComponent( c, gbl, buttongleich,                      6, 8, 4, 2, 1, 1 );

   
   
   
    buttonkommer.addActionListener(this);
    buttonmulty.addActionListener(this);
    buttondivi.addActionListener(this);
    buttonplus.addActionListener(this);
    buttonminus.addActionListener(this);
    buttongleich.addActionListener(this);
   
   
      }

      public static void main( String[] args ) {
         
          new  GridBagLayoutExample ();
      }
     
     
      public void actionPerformed(ActionEvent event) {
          String input = event.getActionCommand();
      }
         
     
     
     

     
     
}
 
MoxxiManagarm

MoxxiManagarm

Ok sieht schon etwas besser aus, aber die Schleife sollte auch den ActionListener und die Positionierung im Grid übernehmen, egal du findest dich da bestimmt noch rein.

Kommen wir zur Rechnung. Ich gehe davon aus, dass der Rechner wie der klassische Windows Rechner funktionieren soll, d.h. Punkt vor Strich wird ignoriert. Was du brauchst:

- Einen Rechnungswert (Zwischenergebnis), dieser startet bei 0
- Eine Ausgewählte Operation, diese started mit +
- Aktuelle Eingabezahl

Der Nutzer startet. Der aktuelle Wert ist 0 und jede Ziffer, welche eingegeben wird, wird mit 0 + n erstmal gesetzt. Die Eingabe einer neuen Ziffer hängt diese an die aktuelle Ziffer an, d.h. bei Zahlen n = n * 10 + m oder bei Strings n = n + m. Durch Auswahl einer neuen Operation (+ - * / =) wird die alte Operation ausgeführt, wenn eine Eingabeziffer vorliegt, anderenfalls wird die ausgewählte Operation ersetzt.

Im Großen und Ganzen ist es kein Hexenwerk, du brauchst aber eben ein paar mehr Felder als nur die Ausgabe im Label. Für den speziellen Fall Rechner rate ich persönlich von dem ActionListener this ab. Du kannst spielen einfach das funktionale Interface an dieser Stelle verwenden.

Beispiel mit Eingabeziffer als String:
Java:
button[i].addActionListener(e -> eingabeziffer = eingabeziffer.equals("0") ? "" + i : eingabeziffer + i);
buttonplus.addActionListener(e -> {
  // berechnet Zwischenergebnis +-*/ Eingabeziffer, je nachdem welche Operation zuvor gesetzt war
  // Speichert die Operation Addition für die nächste Berechnung
  // setzt die neue Eingabeziffer ""
});
buttonc.addActionListener(e -> {
  // setzt Zwischenergebnis zurück auf 0
  // setzt Operation zurück auf +
  // setzt Eingabezahl zurück auf "" 
  // setzt Display zurück
});
 
2

27Flo09

Grundsätzlich denke ich hab ich es verstanden bis auf eine Sache.
Was meinst du genau damit:
Für den speziellen Fall Rechner rate ich persönlich von dem ActionListener this ab. Du kannst spielen einfach das funktionale Interface an dieser Stelle verwenden.
Bzw mein Problem woher weiß das Programm wann ich eine Zahl und wann eine Operation eingebe. Im moment wird bei mir ja alles zusammen in einen String gepackt.
 
J

JustNobody

Nur am Rande: Button 9 wird nicht erstellt:
Java:
   JButton[] buttons = new JButton[10];
  
    for(int i = 0; i<9; i++){
      buttons[i] = new JButton(" "+i);
    }
Das Array hat die richtige Größe (10) und hat damit die Indices 0 - 9. Aber deine Schleife geht nur bis 8.
Also entweder < Größe des Arrays (also i < 10) oder wenn Du den letzten Index angeben willst, dann <= letzter Index (also i <= 9)

Das nur als kleine Anmerkung zu deinem Code was mir direkt ins Auge gefallen ist beim überfliegen.
 
MoxxiManagarm

MoxxiManagarm

Bzw mein Problem woher weiß das Programm wann ich eine Zahl und wann eine Operation eingebe. Im moment wird bei mir ja alles zusammen in einen String gepackt.
Genau dafür brauchst du die Listeners. Du kannst auch 2 Listener erstellen, einen für das Display und einen für die Operationen. Das mit den Operationen habe ich dir oben erläutert
 
mihe7

mihe7

Grundsätzlich denke ich hab ich es verstanden bis auf eine Sache.
Was meinst du genau damit:
Damit meint Moxxi, dass Du nicht "this" als ActionListener verwenden sollst, sondern jedem Button seinen eigenen ActionListener geben sollst. Da ActionListener nur eine einzige Methode deklariert, die implementiert werden muss, handelt es sich um ein funktionales Interface. Ein funktionales Interface kann mit Hilfe von Lambda-Ausdrücken sehr einfach implementiert werden, wie Du an der Schreibweise mit "->" siehst.
 
MoxxiManagarm

MoxxiManagarm

Das ist jetzt nur quick & dirty (viele Sonderfälle und Errors nichts behandelt) und ich habe bewusst viele Sachen rausgelassen, die du brauchst, schließlich ist es deine Hausaufgabe und Übung. Aber folgendes Beispiel soll nur veranschaulichen, wie meine Anmerkungen zuvor gemeint sind:

(Edit: Ich sehe gerade es gibt auch einen DoubleBinaryOperator, der wäre natürlich besser geeignet, als BinaryOperator<Double> ;) )

Java:
public class Calculator extends JFrame {

    enum Operation {
        ADD("+", (Double left, Double right) -> left + right),
        SUB("-", (Double left, Double right) -> left - right),
        MUL("*", (Double left, Double right) -> left * right),
        DIV("/", (Double left, Double right) -> left / right);

        private String indicator;
        private BinaryOperator<Double> operator;

        private Operation(String indicator, BinaryOperator<Double> operator) {
            this.indicator = indicator;
            this.operator = operator;
        }

        public String getIndicator() {
            return indicator;
        }

        public BinaryOperator<Double> getOperator() {
            return operator;
        }
    }

    private double interimResult;
    private String enteredNumber;
    private Operation operation;

    JLabel display;

    public Calculator() {
        setTitle("My Calculator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setLayout(new BorderLayout());

        display = new JLabel("");
        display.setPreferredSize(new Dimension(250, 25));
        add(display, BorderLayout.NORTH);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(3, 5));

        for (int i = 0; i <= 9; i++) {
            buttonPanel.add(createDigitButton(i));
        }

        for (Operation operation : Operation.values()) {
            buttonPanel.add(createOperatorButton(operation));
        }

        JButton equalsButton = createCalculatorButton("=");
        equalsButton.addActionListener((ActionEvent e) -> {
            display.setText(display.getText() + e.getActionCommand());
           
            if (!enteredNumber.equals("")) {
                interimResult = this.operation.getOperator().apply(interimResult, Double.parseDouble(enteredNumber));
            }

            display.setText(display.getText() + interimResult);
        });
        buttonPanel.add(equalsButton);

        add(buttonPanel, BorderLayout.CENTER);

        pack();
    }

    private JButton createOperatorButton(Operation operation) {
        JButton button = createCalculatorButton(operation.getIndicator());
        button.addActionListener((ActionEvent e) -> {
            display.setText(display.getText() + e.getActionCommand());

            if (!enteredNumber.equals("")) {
                interimResult = this.operation.getOperator().apply(interimResult, Double.parseDouble(enteredNumber));
                enteredNumber = "";
            }

            this.operation = operation;
        });
        return button;
    }

    private JButton createDigitButton(int d) {
        JButton button = createCalculatorButton("" + d);
        button.addActionListener((ActionEvent e) -> {
            display.setText(display.getText() + e.getActionCommand());

            enteredNumber += e.getActionCommand();
        });
        return button;
    }

    private JButton createCalculatorButton(String text) {
        JButton button = new JButton(text);
        button.setPreferredSize(new Dimension(50, 50));
        return button;
    }

    public void reset() {
        interimResult = 0;
        enteredNumber = "";
        operation = Operation.ADD;
    }

    public static void main(String... args) {
        Calculator calculator = new Calculator();
        calculator.reset();
        calculator.setVisible(true);
    }
}
 
Zuletzt bearbeitet:
Thema: 

Taschenrechner mit GUI Problem bei der Berechnung

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben