communityWir suchen ständig neue Tutorials und Artikel! Habt ihr selbst schonmal einen Artikel verfasst und seid bereit dieses Wissen mit der Community zu teilen? Oder würdet ihr gerne einmal über ein Thema schreiben das euch besonders auf dem Herzen liegt? Dann habt ihr nun die Gelegenheit eure Arbeit zu veröffentlichen und den Ruhm dafür zu ernten. Schreibt uns einfach eine Nachricht mit dem Betreff „Community Articles“ und helft mit das Angebot an guten Artikeln zu vergrößern. Als Autor werdet ihr für den internen Bereich freigeschaltet und könnt dort eurer literarischen Ader freien Lauf lassen.

Taschenrechner - Rechenoperationen PDF Drucken E-Mail
Benutzerbewertung: / 609
SchwachPerfekt 
Geschrieben von: Kristian   
Sonntag, den 18. September 2005 um 20:01 Uhr
Beitragsseiten
Taschenrechner
Buttons und Ereignisse
Rechenoperationen
Alle Seiten

Implementierung der Operationstasten

Wir haben nun die numerischen Schaltflächen auf unserem Taschenrechner erzeugt und eine zugehörige Ereignisbehandlung implementiert. Jeder Mausklick auf eine Schaltfläche hängt einen String, also eine Zahl im Display an. Nun fehlen uns allerdings noch die Operationstasten, die es uns erlauben diese Zahlen z.B. zu addieren, multiplizieren und das Ergebnis anschließend auf dem Display auszugeben. Dazu benötigen wir eine neue Ereignisbehandlung. Wir nennen diese dem Sinn entsprechend CommandAction, also Kommandoaktion. Die Vorgehensweise ist dieselbe wie schon bei der Ereignisbehandlung der numerischen Tasten mit dem kleinen Unterschied das wir vorerst noch keinen Code in die Methode actionPerformed() schreiben.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
 
public class Calculator
{
   public static void main(String[] args)
   {
      CalculatorFrame frame = new CalculatorFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}
 
class CalculatorFrame extends JFrame
{
   public CalculatorFrame()
   {
      setTitle("Calculator");
      CalculatorPanel panel = new CalculatorPanel();
      add(panel);
      pack();
   }
}
 
class CalculatorPanel extends JPanel
{
   public CalculatorPanel()
   {
      setLayout(new BorderLayout());
      start = true;
      display = new JButton("0");
      display.setEnabled(false);
      add(display, BorderLayout.NORTH);
 
      ActionListener insert = new InsertAction();
      // ActionListener command erzeugen
      ActionListener command = new CommandAction();
 
      panel = new JPanel();
      panel.setLayout(new GridLayout(4, 4)); 
 
      addButton("7", insert);
      addButton("8", insert);
      addButton("9", insert);
      addButton("/", command);
 
      addButton("4", insert);
      addButton("5", insert);
      addButton("6", insert);
      addButton("*", command);
 
      addButton("1", insert);
      addButton("2", insert);
      addButton("3", insert);
      addButton("-", command);
 
      addButton("0", insert);
      addButton(".", insert);
      addButton("=", command);
      addButton("+", command);
 
      add(panel, BorderLayout.CENTER);      
   }
 
   private void addButton(String label, ActionListener listener)
   {
      JButton button = new JButton(label);
      button.addActionListener(listener);
      panel.add(button);
   }
 
   private class InsertAction implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
         String input = event.getActionCommand();
         if (start)
         {
            display.setText("");
            start = false;
         }
         display.setText(display.getText() + input);
      }
   }
 
   private class CommandAction implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
 
      }
   }
 
   private JButton display;
   private JPanel panel;
   private boolean start;
}

Rechenoperationen programmieren

Unser Taschenrechner ist nun fast fertig. Es fehlt nur noch der Code der die Rechenoperationen ausführt. Dazu implementieren wir die Methode public void calculate(double x) und fügen die entsprechende Berechnung in die Ereignisbehandlung CommandAction ein. Negative Zahlen bekommen den Präfix "-", sofern es sich um die erste Operation handelt.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
/**
 * Erstellt einen kleinen Taschenrechner.
 * 
 * @version 1.00 2005-09-03
 * @author  GAGA
 * @link    http://www.codeplanet.eu/ 
 */
public class Calculator
{
   public static void main(String[] args)
   {
      CalculatorFrame frame = new CalculatorFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}
 
class CalculatorFrame extends JFrame
{
   public CalculatorFrame()
   {
      setTitle("Calculator");
      CalculatorPanel panel = new CalculatorPanel();
      add(panel);
      pack();
   }
}
 
class CalculatorPanel extends JPanel
{
   public CalculatorPanel()
   {
      setLayout(new BorderLayout());
 
      result = 0;
      lastCommand = "=";
      start = true;
 
      display = new JButton("0");
      display.setEnabled(false);
      add(display, BorderLayout.NORTH);
 
      ActionListener insert = new InsertAction();
      ActionListener command = new CommandAction();
 
      panel = new JPanel();
      panel.setLayout(new GridLayout(4, 4));
 
      addButton("7", insert);
      addButton("8", insert);
      addButton("9", insert);
      addButton("/", command);
 
      addButton("4", insert);
      addButton("5", insert);
      addButton("6", insert);
      addButton("*", command);
 
      addButton("1", insert);
      addButton("2", insert);
      addButton("3", insert);
      addButton("-", command);
 
      addButton("0", insert);
      addButton(".", insert);
      addButton("=", command);
      addButton("+", command);
 
      add(panel, BorderLayout.CENTER);
   }
 
   private void addButton(String label, ActionListener listener)
   {
      JButton button = new JButton(label);
      button.addActionListener(listener);
      panel.add(button);
   }
 
   private class InsertAction implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
         String input = event.getActionCommand();
         if (start)
         {
            display.setText("");
            start = false;
         }
         display.setText(display.getText() + input);
      }
   }
 
   /**
    * Diese Aktion führt den mit der Taste verbundenen
    * Befehl aus. 
    */
   private class CommandAction implements ActionListener
   {
      public void actionPerformed(ActionEvent event)
      {
         String command = event.getActionCommand();
 
         // Füge den Präfix "-" an den String an wenn
         // es sich um den ersten Befehl handelt (negative Zahl)
         if (start)
         {
            if (command.equals("-"))
            {
               display.setText(command);
               start = false;
            }
            else
               lastCommand = command;
         }
         else
         {
            // Berechnung ausführen
            calculate(Double.parseDouble(display.getText()));
            lastCommand = command;
            start = true;
         }
      }
   }
 
   /**
    * Führt die anstehenden Berechnungen aus.
    * @param x der mit dem vorherigen Ergebnis zu berechnende Wert
    */
   public void calculate(double x)
   {
      if (lastCommand.equals("+")) result += x;
      else if (lastCommand.equals("-")) result -= x;
      else if (lastCommand.equals("*")) result *= x;
      else if (lastCommand.equals("/")) result /= x;
      else if (lastCommand.equals("=")) result = x;
      display.setText("" + result);
   }
 
   private JButton display;
   private JPanel panel;
   private double result;
   private String lastCommand;
   private boolean start;
}

Geschafft! Wahrscheinlich haben sie sich den Aufwand etwas größer vorgestellt. Aber wie sie gesehen haben stellt uns Swing und AWT alle notwendigen Klassen und Methoden die wir brauchen zur Verfügung. Sie können den bestehenden Code natürlich um weitere Funktionen, wie eine Taste für die Kreiszahl PI oder eine zur Berechnung der Fakultät, erweitern.

Abschließend finden Sie das zum Tutorial gehörende Programm, sowie den Source Code als ZIP-Paket gepackt zum Download. Das war's, viel Spass beim nachprogrammieren!



Zuletzt aktualisiert am Montag, den 14. Mai 2018 um 22:18 Uhr
 
AUSWAHLMENÜ