# Grafik Taschenrechner



## Cyz44 (9. Feb 2012)

Hejho ich bin dabei einen Grafischen Taschenrechner für mein Jahresprojekt zu programmieren.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;


/**
  *
  * description
  *
  * @xxx
  */

public class GTR extends JFrame
{
  // Anfang Attribute
  private JLabel display1 = new JLabel();
  private JLabel display2 = new JLabel();
  
  private JButton Null = new JButton();
  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 punkt = new JButton();
  private JButton minus = new JButton();
  private JButton plus = new JButton();
  private JButton mal = new JButton();
  private JButton geteilt = new JButton();
  private JButton enter = new JButton();
  private JButton pi = new JButton();
  private JButton hoch2 = new JButton();
  private JButton wurzel = new JButton();
  private JButton variable = new JButton();

  boolean start = true;
  private String lastCommand;
  private double result;
  
  JFrame fenster = null;
  JPanel hauptFlaeche = null;
  ZeichenFlaeche zeichenFlaeche = null;
  JFrame kasten = null;
  JPanel hauptKasten = null;
  ZeichenFlaeche zeichenKasten = null;
  


  private JButton delete = new JButton();
  private JButton graph = new JButton();
  // Ende Attribute

  public GTR (String title)
  {
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 617; 
    int frameHeight = 696;
    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);
    Container cp = getContentPane();
    cp.setLayout(null);
    cp.setBackground(new Color(0xB8CFE5));
    
    zeichne();
    Linie();

    // Anfang Komponenten



    Null.setBounds(88, 288, 60, 40);
    Null.setText("0");
    Null.setMargin(new Insets(2, 2, 2, 2));
    Null.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        Null_ActionPerformed(evt);

        String text = display1.getText();
        text += "0";
        display1.setText(text);



      }
    });
    cp.add(Null);

    eins.setBounds(88, 240, 60, 40);
    eins.setText("1");
    eins.setMargin(new Insets(2, 2, 2, 2));
    eins.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        eins_ActionPerformed(evt);

        String text = display1.getText();
        text += "1";
        display1.setText(text);
      }
    });
    cp.add(eins);

    zwei.setBounds(160, 240, 60, 40);
    zwei.setText("2");
    zwei.setMargin(new Insets(2, 2, 2, 2));
    zwei.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        zwei_ActionPerformed(evt);

        String text = display1.getText();
        text += "2";
        display1.setText(text);
      }
    });
    cp.add(zwei);

    drei.setBounds(232, 240, 60, 40);
    drei.setText("3");
    drei.setMargin(new Insets(2, 2, 2, 2));
    drei.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        drei_ActionPerformed(evt);

        String text = display1.getText();
        text += "3";
        display1.setText(text);
      }
    });
    cp.add(drei);

    vier.setBounds(88, 192, 60, 40);
    vier.setText("4");
    vier.setMargin(new Insets(2, 2, 2, 2));
    vier.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        vier_ActionPerformed(evt);

        String text = display1.getText();
        text += "4";
        display1.setText(text);
      }
    });
    cp.add(vier);

    fuenf.setBounds(160, 192, 60, 40);
    fuenf.setText("5");
    fuenf.setMargin(new Insets(2, 2, 2, 2));
    fuenf.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        fuenf_ActionPerformed(evt);

        String text = display1.getText();
        text += "5";
        display1.setText(text);
      }
    });
    cp.add(fuenf);

    sechs.setBounds(232, 192, 60, 40);
    sechs.setText("6");
    sechs.setMargin(new Insets(2, 2, 2, 2));
    sechs.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        sechs_ActionPerformed(evt);

        String text = display1.getText();
        text += "6";
        display1.setText(text);
      }
    });
    cp.add(sechs);

    sieben.setBounds(88, 144, 60, 40);
    sieben.setText("7");
    sieben.setMargin(new Insets(2, 2, 2, 2));
    sieben.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        sieben_ActionPerformed(evt);

        String text = display1.getText();
        text += "7";
        display1.setText(text);
      }
    });
    cp.add(sieben);

    acht.setBounds(160, 144, 60, 40);
    acht.setText("8");
    acht.setMargin(new Insets(2, 2, 2, 2));
    acht.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        acht_ActionPerformed(evt);

        String text = display1.getText();
        text += "8";
        display1.setText(text);
      }
    });
    cp.add(acht);

    neun.setBounds(232, 144, 60, 40);
    neun.setText("9");
    neun.setMargin(new Insets(2, 2, 2, 2));
    neun.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        neun_ActionPerformed(evt);

        String text = display1.getText();
        text += "9";
        display1.setText(text);
      }
    });
    cp.add(neun);

    punkt.setBounds(160, 288, 60, 40);
    punkt.setText(".");
    punkt.setMargin(new Insets(2, 2, 2, 2));
    punkt.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        punkt_ActionPerformed(evt);

        String text = display1.getText();
        text += ".";
        display1.setText(text);
      }
    });
    cp.add(punkt);

    minus.setBounds(304, 192, 60, 40);
    minus.setText("-");
    minus.setMargin(new Insets(2, 2, 2, 2));
    minus.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        String text = display1.getText();
        text += "-";
        display1.setText(text);
      }
    });
    cp.add(minus);


    plus.setBounds(304, 144, 60, 40);
    plus.setText("+");
    plus.setMargin(new Insets(2, 2, 2, 2));
    plus.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        plus_ActionPerformed(evt);
        String text = display1.getText();
        text += "+";
        display1.setText(text);
      }
    });
    cp.add(plus);

    mal.setBounds(304, 240, 60, 40);
    mal.setText("*");
    mal.setMargin(new Insets(2, 2, 2, 2));
    mal.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        mal_ActionPerformed(evt);
        String text = display1.getText();
        text += "*";
        display1.setText(text);
      }
    });
    cp.add(mal);

    geteilt.setBounds(304, 288, 60, 40);
    geteilt.setText("÷");
    geteilt.setMargin(new Insets(2, 2, 2, 2));
    geteilt.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        geteilt_ActionPerformed(evt);
        String text = display1.getText();
        text += "/";
        display1.setText(text);
      }
    });
    cp.add(geteilt);

    enter.setBounds(232, 288, 60, 40);
    enter.setText("Enter");
    enter.setMargin(new Insets(2, 2, 2, 2));
    enter.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        enter_ActionPerformed(evt);

        String rechnung = display1.getText();
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("js");
        try{
               String text =  (engine.eval(rechnung)).toString();
               display1.setText(text);
            }  catch(Exception e){}
      }
    });
    cp.add(enter);



    pi.setBounds(376, 192, 60, 40);
    pi.setText("?");
    pi.setMargin(new Insets(2, 2, 2, 2));
    pi.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        pi_ActionPerformed(evt);
      }
    });
    cp.add(pi);

    hoch2.setBounds(376, 240, 60, 40);
    hoch2.setText("x²");
    hoch2.setMargin(new Insets(2, 2, 2, 2));
    hoch2.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        hoch2_ActionPerformed(evt);
      }
    });
    cp.add(hoch2);

    wurzel.setBounds(376, 288, 60, 40);
    wurzel.setText("v");
    wurzel.setMargin(new Insets(2, 2, 2, 2));
    wurzel.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        wurzel_ActionPerformed(evt);
      }
    });
    cp.add(wurzel);

    variable.setBounds(376, 144, 60, 40);
    variable.setText("x");
    variable.setMargin(new Insets(2, 2, 2, 2));
    variable.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        variable_ActionPerformed(evt);
      }
    });
    cp.add(variable);


    delete.setBounds(448, 144, 60, 40);
    delete.setText("C");
    delete.setMargin(new Insets(2, 2, 2, 2));
    delete.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        delete_ActionPerformed(evt);

        display1.setText("");

      }
    });
    cp.add(delete);


    display1.setBounds(90, 30, 420, 90);
    display1.setText("");
    display1.setOpaque(true);
    cp.add(display1);

    graph.setBounds(448, 192, 60, 40);
    graph.setText("Graph");
    graph.setMargin(new Insets(2, 2, 2, 2));
    graph.addActionListener(new ActionListener()
    {
      public void actionPerformed(ActionEvent evt)
      {
        fenster.setVisible(true);
      }
    });
    cp.add(graph);

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden



  public void Linie()
  {
    zeichenFlaeche.setzeLinie(50, 350, 750, 350);     // x- Achse
    zeichenFlaeche.setzeLinie(400, 50, 400, 650);     // y- Achse
    
    zeichenFlaeche.setzeLinie(420, 345, 420, 355);
    zeichenFlaeche.setzeLinie(440, 345, 440, 355);
    zeichenFlaeche.setzeLinie(460, 345, 460, 355);
    zeichenFlaeche.setzeLinie(480, 345, 480, 355);
    zeichenFlaeche.setzeLinie(500, 345, 500, 355);

    
  }



  public void zeichne()
  {
    fenster = new JFrame();
    fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fenster.setTitle("Koordinatensystem");
    hauptFlaeche = new JPanel(new BorderLayout());
    zeichenFlaeche = new ZeichenFlaeche(800, 700);
    hauptFlaeche.add(zeichenFlaeche, BorderLayout.CENTER);
    fenster.getContentPane().add(hauptFlaeche);
    fenster.pack();
    fenster.setVisible(false);
  }
  


  public void Null_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void eins_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void zwei_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void drei_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void vier_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void fuenf_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void sechs_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void sieben_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void acht_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void neun_ActionPerformed(ActionEvent evt)
  {
    // TODO hier Quelltext einfügen
  }

  public void punkt_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void minus_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void plus_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void mal_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void geteilt_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void enter_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void pi_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void hoch2_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void wurzel_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void variable_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void delete_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }



  // Ende Methoden




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

}
```

Wie ihr seht das ungefähre Koordinatensystem hab ich erstellt. Mein Hauptproblem ist jetzt zu schaffen, dass man die Achsenskalierung beliebig ändern kann. Dazu kommt die einteilung, kp wie man das eleganter machen kann als so wie ich damit angefangen habe.


----------



## Kevin94 (9. Feb 2012)

Wie wärs wenn du die Klasse ZeichenFläche auch Postest, die wäre primär intressant. Deine GUI drum herum ist ja Standard.
Die Buttons mit den Zahlen könnte man imho einfacher in einem Array speichern, spart Code und läst sich einfacher in Schleifen handeln.


----------



## Cyz44 (9. Feb 2012)

Ich hab gar keine Klasse ZeichanFlaeche 
nur ne methode zeichne() in der ich die zeichenFlaeche dann deklariert habe, hier:


```
public void zeichne()
  {
    fenster = new JFrame();
    fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fenster.setTitle("Koordinatensystem");
    hauptFlaeche = new JPanel(new BorderLayout());
    zeichenFlaeche = new ZeichenFlaeche(800, 700);
    hauptFlaeche.add(zeichenFlaeche, BorderLayout.CENTER);
    fenster.getContentPane().add(hauptFlaeche);
    fenster.pack();
    fenster.setVisible(false);
  }
```

und mit der methode linie() zeichne ich halt die ganzen linien:


```
public void Linie()
  {
    zeichenFlaeche.setzeLinie(50, 350, 750, 350);     // x- Achse
    zeichenFlaeche.setzeLinie(400, 50, 400, 650);     // y- Achse
    
    zeichenFlaeche.setzeLinie(420, 345, 420, 355);
    zeichenFlaeche.setzeLinie(440, 345, 440, 355);
    zeichenFlaeche.setzeLinie(460, 345, 460, 355);
    zeichenFlaeche.setzeLinie(480, 345, 480, 355);
    zeichenFlaeche.setzeLinie(500, 345, 500, 355);
    
    zeichenFlaeche.setzeLinie(380, 345, 380, 355);
    zeichenFlaeche.setzeLinie(360, 345, 360, 355);
    zeichenFlaeche.setzeLinie(340, 345, 340, 355);
    zeichenFlaeche.setzeLinie(320, 345, 320, 355);
    zeichenFlaeche.setzeLinie(300, 345, 300, 355);
  }
```

Mehr hab ich nicht, wie du schon sagst, der rest ist für die GUI bzw. die Grundrechenarten .


----------



## Kevin94 (9. Feb 2012)

Du hast also nichts vorzuweisen, als dass du eine Nichtvorhandene Klasse benutzt, die du offensichtlich selber schreiben musst. (Oder nach einem Framework suchst, dass das schon kann, aber das soll wahrscheinlich nicht Sinn des Projekts sein, sonst würdes du dir einfach Geogebra runterladen).

Ich könnte dir eine ziemlich umfangreiche Komplettlösung posten, da ich das selbe Projekt auch erst vollendet habe, aber das hätte den selben Effekt, als wenn du dir ein Framework suchst, nur mit weniger befriedigendem Ergebnis.

Das Einzige was also hilft, ist das du dir mühsam diese Komponente, die einen Graphen zeichnet selber schreibst.


----------



## Cyz44 (9. Feb 2012)

ok also das klingt ja erstmal nicht sehr ermutigend^^

Also wenn ich das richtig verstehe hast du das selbe gemacht wie ich gerade? Ich bin nämlich mehr oder weniger noch Anfänger und das ist jetzt einfach ne ganz neue Ebene für mich^^

Also die Oberfläche und die Rechenarten hab ich ja noch hinbekommen, die zeichenfläche auch iwie aber da ist auch schon schluss. Wie müsste ich es denn angehen, dass man die skalierung der achsen beliebig ändern kann? Muß ich dafür erstmal das gesamte Koordinatensystem zeichnen ( z.B. x-achse: -1000 bis +1000 & y-achse: -2000 bis +2000 )?  Und dann halt jenachdem welchen bereich man sehen möchte, diesen bereich sichtbar werden lassen?


----------



## HimBromBeere (10. Feb 2012)

Also nach allem, was ich bisher gelesen habe, hast du eine GUI erstellt aber keinen blassen Dunst, wie du da drin jetzt was zeichnest. Schau dir dazu mal das hier an: http://www.java-forum.org/entwuerfe/113007-kein-swing-tutorial.html

Und teile deinen Code mal in sinnvolle Klassen auf (und fasse die ganzen Buttons mal in ein Array, da musst du dann niht hundert mal den selben code schreiben, sondern machst ein hübsches Schleifchen drum und fertig...).
Wenn du mit dem Zeichnen klarkommst, kannst du dich ans Skalieren machen. Dafür wurde AffineTransformation erfunden, alternativ kannst du aber auch über die scale-Methode des Graphikkontexts gehen, aber wie gesagt, alles der Reihe nach.


----------

