GUI-Taschenrechner rechnet nicht

Status
Nicht offen für weitere Antworten.

sliwalker

Top Contributor
Hoi zusammen,

Wir haben gerade angefangen GUI zu erstellen.
Als Uebung wollte ich mir nen simplen Taschenrechner bauen, doch er rechnet nicht ;(
Ich sitz da jetzt seit 16h dran ( jetzt 19:50).
Bitte helft mir, wenn ihr "einen" Fehler seht.

Hier der Code:
Code:
/*
 * Created on 26.05.2004
 * @author sliwalker
 */

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


class calc extends JFrame
{
	// Eigenschaften
	JPanel p1;
	JPanel p2;
	JPanel p3;
	
	JTextField zahl1;
	JTextField zahl2;
	JTextField erg;
	
	JButton addier;
	JButton sub;
	JButton mul;
	JButton div;
	
	
	public void addierac(ActionEvent ae)
	{
		String s1 = zahl1.getText();
		String s2 = zahl2.getText();
		int num1 = Integer.parseInt(s1);
		int num2 = Integer.parseInt(s2);
		int ergebnis = num1 + num2;
		String summe = Integer.toString(ergebnis);
		erg.setText(summe);
	}
	
	public void subac(ActionEvent ae)
	{
		String s1 = zahl1.getText();
		String s2 = zahl2.getText();
		int num1 = Integer.parseInt(s1);
		int num2 = Integer.parseInt(s2);
		int ergebnis = num1 - num2;
		String summe = Integer.toString(ergebnis);
		erg.setText(summe);
	}
	
	public void mulac(ActionEvent ae)
	{
		String s1 = zahl1.getText();
		String s2 = zahl2.getText();
		int num1 = Integer.parseInt(s1);
		int num2 = Integer.parseInt(s2);
		int ergebnis = num1 * num2;
		String summe = Integer.toString(ergebnis);
		erg.setText(summe);
	}
	
	public void divac(ActionEvent ae)
	{
		String s1 = zahl1.getText();
		String s2 = zahl2.getText();
		int num1 = Integer.parseInt(s1);
		int num2 = Integer.parseInt(s2);
		int ergebnis = num1 / num2;
		String summe = Integer.toString(ergebnis);
		erg.setText(summe);
	}
	

	public calc()
	{
		super("Mini-Rechner");
		
		Container contentPane = getContentPane();
		contentPane.setLayout(new BorderLayout());
		
		p1 = new JPanel();
		p1.setLayout(new FlowLayout(FlowLayout.CENTER));
		p2 = new JPanel();
		p2.setLayout(new GridLayout(3,2));
		p3 = new JPanel();
		p3.setLayout(new FlowLayout(FlowLayout.RIGHT));
		
		zahl1 = new JTextField(5);
		zahl2 = new JTextField(5);
		erg   = new JTextField(5);
		addier = new JButton(" + ");
		sub   = new JButton(" - ");
		mul   = new JButton(" * ");
		div   = new JButton(" / ");
				
		p1.add(new JLabel("SLi`s Mini-Rechner"));
		p2.add(new JLabel("Zahl1: "));
		p2.add(zahl1);
		p2.add(new JLabel("Zahl2: "));
		p2.add(zahl2);
		p2.add(new JLabel("Ergebnis: "));
		p2.add(new JTextField(10));
		p3.add(addier);
		p3.add(sub);
		p3.add(mul);
		p3.add(div);
		pack();
	
		
		addier.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent ae)
			{
				addierac(ae);
			}
		});
		sub.addActionListener(new ActionListener()
				{
			public void actionPerformed(ActionEvent ae)
			{
				subac(ae);
			}
		});
		mul.addActionListener(new ActionListener()
				{
			public void actionPerformed(ActionEvent ae)
			{
				mulac(ae);
			}
		});
		div.addActionListener(new ActionListener()
				{
			public void actionPerformed(ActionEvent ae)
			{
				divac(ae);
			}
		});
		
		contentPane.add("North",p1);
		contentPane.add("Center",p2);		
		contentPane.add("South",p3);
		
	}
}
public class rechner
{

	public static void main(String[] args)
	{
		calc c = new calc();
		c.setBounds(100,100,500,400);
		c.show();
	}
}

Danke für eure Hilfe.
greetz
Sli
 
Och, du hast leider das Textfeld mit dem Ergebnis nicht angezeigt:

anstelle von
Code:
      p2.add(new JLabel("Ergebnis: "));
      p2.add(new JTextField(10));

solltest du
Code:
      p2.add(new JLabel("Ergebnis: "));
      p2.add( erg );
verwenden.


mfg Beni
 
Hab es gerade auch herausgefunden (herausprobiert).
Läuft auch einwandfrei.

Aber warum geht das nicht mit einem Textfeld?
Das ging in einem anderem Beispiel von unserem Lehrer.
(Kann ich auf Wunsch posten.)

Naja. Mit dem Label gehts auch und nur das zählt😉

Danke für Deine Mühe 😉

Eine Frage noch dazu:
Muss man eigentlich soviele ActionListener für die Buttons schreiben?
Das kann man doch bestimmt automatisieren.
Hätte da wer mal nen Wink in eine Richtung?

greetz
SLi
 
*winke winke*
:lol:

hatte gerade bei meiner zigarette nix besseres zu tun 8)
dein textfeld funzt und das mit dem actionlistener musst dir anschauen.....

Code:
/* 
* Created on 26.05.2004 
* @author sliwalker 
*/ 

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


class calc extends JFrame 
{ 
   // Eigenschaften 
   JPanel p1; 
   JPanel p2; 
   JPanel p3; 
    
   JTextField zahl1; 
   JTextField zahl2; 
   
   JButton addier; 
   JButton sub; 
   JButton mul; 
   JButton div; 
   
   JTextField erg=new JTextField(10);
   
   Listener listi =new Listener();
    
    
   public void addierac() 
   { 
      String s1 = zahl1.getText(); 
      String s2 = zahl2.getText(); 
      int num1 = Integer.parseInt(s1); 
      int num2 = Integer.parseInt(s2); 
      int ergebnis = num1 + num2; 
      String summe = Integer.toString(ergebnis); 
      erg.setText(summe); 
   } 
    
   public void subac() 
   { 
      String s1 = zahl1.getText(); 
      String s2 = zahl2.getText(); 
      int num1 = Integer.parseInt(s1); 
      int num2 = Integer.parseInt(s2); 
      int ergebnis = num1 - num2; 
      String summe = Integer.toString(ergebnis); 
      erg.setText(summe); 
   } 
    
   public void mulac() 
   { 
      String s1 = zahl1.getText(); 
      String s2 = zahl2.getText(); 
      int num1 = Integer.parseInt(s1); 
      int num2 = Integer.parseInt(s2); 
      int ergebnis = num1 * num2; 
      String summe = Integer.toString(ergebnis); 
      erg.setText(summe); 
   } 
    
   public void divac() 
   { 
      String s1 = zahl1.getText(); 
      String s2 = zahl2.getText(); 
      int num1 = Integer.parseInt(s1); 
      int num2 = Integer.parseInt(s2); 
      int ergebnis = num1 / num2; 
      String summe = Integer.toString(ergebnis); 
      erg.setText(summe); 
   } 
    

   public calc() 
   { 
      super("Mini-Rechner"); 
       
      Container contentPane = getContentPane(); 
      contentPane.setLayout(new BorderLayout()); 
       
      p1 = new JPanel(); 
      p1.setLayout(new FlowLayout(FlowLayout.CENTER)); 
      p2 = new JPanel(); 
      p2.setLayout(new GridLayout(3,2)); 
      p3 = new JPanel(); 
      p3.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
       
      zahl1 = new JTextField(5); 
      zahl2 = new JTextField(5); 
      erg   = new JTextField(5); 
      addier = new JButton(" + "); 
      sub   = new JButton(" - "); 
      mul   = new JButton(" * "); 
      div   = new JButton(" / "); 
             
      p1.add(new JLabel("SLi`s Mini-Rechner")); 
      p2.add(new JLabel("Zahl1: ")); 
      p2.add(zahl1); 
      p2.add(new JLabel("Zahl2: ")); 
      p2.add(zahl2); 
      p2.add(new JLabel("Ergebnis: ")); 
      p2.add(erg); 
      p3.add(addier); 
      p3.add(sub); 
      p3.add(mul); 
      p3.add(div); 
      pack(); 
      

      addier.addActionListener(listi); 
      sub.addActionListener(listi); 
      mul.addActionListener(listi);  
      div.addActionListener(listi); 

       
      contentPane.add("North",p1); 
      contentPane.add("Center",p2);       
      contentPane.add("South",p3); 
       
   } 
   class Listener implements ActionListener
      {
	public void actionPerformed(ActionEvent ae) 
	{
	        JButton button = (JButton)ae.getSource();
				
	        if(button==addier)
	        addierac(); 

      	        if(button==sub)
            	        subac(); 
 
      	        if(button==mul)
            	        mulac(); 

      	        if(button==div)
	        divac(); 
	}
        }
} 
public class rechner 
{ 

   public static void main(String[] args) 
   { 
      calc c = new calc(); 
      c.setBounds(100,100,500,400); 
      c.show(); 
   } 
}
 
Nein brauchst du nicht.

Wenn du am Anfang den ActionListener als Interface implementierts, kriegst du eine methode
Code:
actionPerformed
, in der du dann die einzelnen Actions abarbeiten kannst.

Ein Beispiel um es besser verständlich zu machen:
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Fenster1 extends JFrame implements ActionListener{


 public Fenster1(){
   setTitle("Der Fenstertitel");
   setSize(200,300);
   
   JButton knopf = new JButton("24. Dezember");
   getContentPane().add(knopf);
   
   knopf.addActionListener(this); //weist dem Button zu das diese Klasse den ActionListener enthält

   /* Mit setActionCommand() kannst du den String festlegen, der "geschickt" wird, 
    * wenn diese Aktion ausgeführt wird.
    * Wenn du es nicht verwendest, wird der Text (also "24. Dezember") als ActionCommand "gesendet" 
    * */
   knopf.setActionCommand("weihnachtsknopf gedrückt");


   setVisible(true); //macht das Fenster sichtbar
 }

 /* Hier ist die actionPerformed-Methode */
 public void actionPerformed(ActionEvent e)
    {
        String c = e.getActionCommand(); //holt sich den ActionCommand
        
        if( c.equals("weihnachtsknopf gedrückt") ){ //überprüft was drin steht und tut dann das gewünschte
          System.out.println("Frohe Weihnachten!");
        }
    }
 
 public static void main(String[] args){
  new Fenster1();     
 }
}

Ich hoffe ich konnte dir helfen. Wenn du noch Fragen hast. Poste einfach munter weiter.

BTW: Schau dir amal folgendes an: http://www.javabuch.de/
Is wirklich super!!!

MfG
Philipp
 
Moin,

danke für die super Antworten!
Besonders die zweite Lösung gefällt mir, da sie genau das macht,
was ich mir vorgestellt habe 😉
Ist auch alles bestens kommentiert. So das ich jetzt mal versuche das umzusetzen.
Ich werd mich gleich mal an einen neuen Taschenrechner
mit ca 14 Buttons und nur einem Ergebnisfeld machen.
Ich bin mir sicher da werden noch einige Fragen aufkommen 😉

greetz
SLi
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben