Taschenrechner

Slaid

Mitglied
Hallo Liebe Leute,

Ich stehe vor dem Problem die Tasten eines Taschenrechners zu "aktivieren" / dem ActionListiner zu zuordnen...
Bisher sieht das gute Stück so aus:
5k93f3w5.png



Zunächst einmal die Klasse TRView

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

/**
 * Erzeugt einen Taschenrechner
 * @author Joe
 *
 */
public class TRView extends JFrame // eigene Frame Klasse wird definiert
{
	private JTextField anzeige = new JTextField();
	{ 
	this.anzeige.setEditable(false); 
//	anzeige.setPreferredSize(new Dimension(300,20));
	}
	Container c; //Container dieses Frames
	JPanel oben, mitte; //Panel erstellen 
	
	static JButton b[] = new JButton[10]; // Tasten 1-9
	
	static JButton buttonplus = new JButton("+");
	static JButton buttonminus = new JButton("-");
	static JButton buttonmal = new JButton("*");
	static JButton buttongeteilt = new JButton("/");
	static JButton buttongleich = new JButton("=");
	static JButton buttoncancel = new JButton("c");
	static JButton buttonnull = new JButton("0");
	
	
	protected TRModel model = new TRModel();
	protected TRControl controller = new TRControl(this, model);
	
	public TRView()
	{ 
		super ("Taschenrechner1.0");
		c = getContentPane(); //Bestimme die Referenz auf den eigenen Container
		
		
		oben = new JPanel();//panel erzeugen
		mitte = new JPanel(new GridLayout(4,4));
		anzeige = new JTextField("");
		anzeige.setPreferredSize(new Dimension(290,20));
		oben.add(anzeige);
		
		for(int i = 1; i< 10; i++)
		{ //Erstellt die Tasten 1-9
			b[i] = new JButton (""+ i);
			mitte.add(b[i]);
			if(i == 3)
			{
				mitte.add(buttonplus); //erstellt das Plus nach der 3 
			}
			if(i == 6)
			{
				mitte.add(buttonminus); // erstellt das minus nach der 6 
			}
			if(i== 9)
			{
				mitte.add(buttonmal); // untere Tasten 
				mitte.add(buttoncancel);
				mitte.add(buttonnull);
				mitte.add(buttongleich);
				mitte.add(buttongeteilt);
			}
		}
		c.add(oben,BorderLayout.NORTH); //Textfeld
		c.add(mitte,BorderLayout.WEST); //Tasten
	
		//for (JButton a : b) { a.addActionListener(controller); }
	}
	public void update() {
		String result = model.getResult();
		String operator = model.getOperator();
		String operand = model.getOperand();
		String error = model.getError().equals("") ? "" : (model.getError() + "!!!");
		anzeige.setText(result + operator + operand + error);
	}

	public static void main(String[] args) 
	{
		TRView rechner = new TRView();//Erzeuge ein Fesnter Objekt 
		rechner.setSize(300,300); //Größe des Fesnters
		rechner.setLocation(250, 190);
		rechner.setVisible(true); //Darstellen des Fesnters
		rechner.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Fenster schließen
		rechner.setLayout(new BorderLayout());
	}
}

und die Klasse TRControl

Java:
import java.awt.event.*;


public class TRControl implements ActionListener {
	
	/**
	 * Datenfelder des Controller Objekts eines Taschenrechners
	 */
	
	private TRView view;
	private TRModel model;
	
	/**
	 * Konstruktor zum Anlegen eines Taschenrechner Controller Objekts
	 * @param v Viewobjekt eines Taschenrechners, dass dieser Controller betreut
	 * @param m Modelobjekt eines Taschenrechners, dass dieser Controller betreut
	 */
	
	public TRControl (TRView v, TRModel m) {
		this.view = v;
		this.model = m;
	}
	
	/* ActionListener - Diese Methode wird immer aufgerufen, wenn ein Button auf dem TR
	* betaetigt wurde.
	*/
	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource() == TRView.b) zahlAnhaengen("");
		
		if (ev.getSource() == TRView.buttonnull) zahlAnhaengen("0"); // 0
		
		if (ev.getSource() == TRView.buttonplus) setRechenzeichen("+"); // Plus
		if (ev.getSource() == TRView.buttonminus) setRechenzeichen("-"); // Minus
		if (ev.getSource() == TRView.buttonmal) setRechenzeichen("*"); // Mal
		if (ev.getSource() == TRView.buttongeteilt) setRechenzeichen("/"); // Geteilt
		if (ev.getSource() == TRView.buttongleich) berechnen(); // =
		if (ev.getSource() == TRView.buttoncancel) loeschen(); // C
	}
	
	/**
	* Wird aufgerufen, wenn eine Zahl auf dem Taschenrechner betaetigt wurde
	* Diese Zahl wird der aktuell auf dem Display stehenden Zahl angehaengt
	* @param i Die Ziffer die an den aktuell eingegebenen Operanden angehaengt werden soll
	*/
	private void zahlAnhaengen (String i) {
		model.setOperand(model.getOperand() + i);
		view.update();
	}
	
	/**
	* Wird aufgerufen, wenn eine Operatoraste, -, /, *) betaetigt wurde
	* @param i Der eingegebene Operator (+, -, /, *)
	*/
	
	private void setRechenzeichen (String i) {
		model.setOperator(i);
		view.update();
	}
	
	/**
	* Wird aufgerufen, wenn die C Taste auf einem Taschenrechner
	* betaetigt wurde.
	*/
	private void loeschen() {
		model.clear();
		view.update();
	}
	
	/**
	* Wird aufgerufen, wenn die = Taste auf einem Taschenrechner betaetigt wurde.
	*/
	private void berechnen() {
		model.berechne();
		view.update();
	}
}

Die Klasse TRModell sollte soweit richtig sein diese könnte ich bei Bedarf posten.

Zu meiner Frage:

In der Klasse TRView Zeile 69.
Dort wollte ich die Buttons dem ActionListiner zuordnen doch weiß nicht genau wie ich das anstellen soll ...
auch bin ich mir unsicher mit dem static in Zeile 19-27
wenn ich das Static entferne gibt es Probleme mit der Klasse TRControl..

Ich hoffe ihr könnt mir helfen

Falls ihr Verbesserungsvorschläge habt
immer her damit !
:toll:
 

Slaid

Mitglied
Nachtrag:

Ich habe nun "static" gelöscht und im TRControl alles von TRView zu view geändert

und in Zeile 47
Java:
b[i].addActionListener(controller);

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

/**
 * Erzeugt einen Taschenrechner
 * 
 * @author Joe
 * 
 */
public class TRView extends JFrame // eigene Frame Klasse wird definiert
{
	private JTextField anzeige = new JTextField();
	{
		this.anzeige.setEditable(false);
		// anzeige.setPreferredSize(new Dimension(300,20));
	}
	Container c; // Container dieses Frames
	JPanel oben, mitte; // Panel erstellen

	JButton b[] = new JButton[10]; // Tasten 1-9

	JButton buttonplus = new JButton("+");
	JButton buttonminus = new JButton("-");
	JButton buttonmal = new JButton("*");
	JButton buttongeteilt = new JButton("/");
	JButton buttongleich = new JButton("=");
	JButton buttoncancel = new JButton("c");
	JButton buttonnull = new JButton("0");
	
	
	protected TRModel model = new TRModel();
	protected TRControl controller = new TRControl(this, model);

	public TRView() {
		super("Taschenrechner1.0");
		c = getContentPane(); // Bestimme die Referenz auf den eigenen Container

		oben = new JPanel();// panel erzeugen
		mitte = new JPanel(new GridLayout(4, 4));
		anzeige = new JTextField("");
		anzeige.setPreferredSize(new Dimension(290, 20));
		oben.add(anzeige);

		for (int i = 1; i < 10; i++)

		{
			b[i].addActionListener(controller);

			b[i] = new JButton("" + i);
			mitte.add(b[i]);
			if (i == 3) {
				mitte.add(buttonplus); // erstellt das Plus nach der 3
			}
			if (i == 6) {
				mitte.add(buttonminus); // erstellt das minus nach der 6
			}
			if (i == 9) {
				mitte.add(buttonmal); // untere Tasten
				mitte.add(buttoncancel);
				mitte.add(buttonnull);
				mitte.add(buttongleich);
				mitte.add(buttongeteilt);
			}

			c.add(oben, BorderLayout.NORTH); // Textfeld
			c.add(mitte, BorderLayout.WEST); // Tasten
		}
	}

	public void update() {
		String result = model.getResult();
		String operator = model.getOperator();
		String operand = model.getOperand();
		String error = model.getError().equals("") ? ""
				: (model.getError() + "!!!");
		anzeige.setText(result + operator + operand + error);
	}

	public static void main(String[] args) {
		TRView rechner = new TRView();// Erzeuge ein Fesnter Objekt
		rechner.setSize(300, 300); // Größe des Fesnters
		rechner.setLocation(250, 190);
		rechner.setVisible(true); // Darstellen des Fesnters
		rechner.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// Fenster
																// schließen
		rechner.setLayout(new BorderLayout());
	}
}

Java:
import java.awt.event.*;


public class TRControl implements ActionListener {
	
	/**
	 * Datenfelder des Controller Objekts eines Taschenrechners
	 */
	
	private TRView view;
	private TRModel model;
	
	/**
	 * Konstruktor zum Anlegen eines Taschenrechner Controller Objekts
	 * @param v Viewobjekt eines Taschenrechners, dass dieser Controller betreut
	 * @param m Modelobjekt eines Taschenrechners, dass dieser Controller betreut
	 */
	
	public TRControl (TRView v, TRModel m) {
		this.view = v;
		this.model = m;
	}
	
	/* ActionListener - Diese Methode wird immer aufgerufen, wenn ein Button auf dem TR
	* betaetigt wurde.
	*/
	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource() == view.b) zahlAnhaengen("");
		
		if (ev.getSource() == view.buttonnull) zahlAnhaengen("0"); // 0
		
		if (ev.getSource() == view.buttonplus) setRechenzeichen("+"); // Plus
		if (ev.getSource() == view.buttonminus) setRechenzeichen("-"); // Minus
		if (ev.getSource() == view.buttonmal) setRechenzeichen("*"); // Mal
		if (ev.getSource() == view.buttongeteilt) setRechenzeichen("/"); // Geteilt
		if (ev.getSource() == view.buttongleich) berechnen(); // =
		if (ev.getSource() == view.buttoncancel) loeschen(); // C
	}
	
	/**
	* Wird aufgerufen, wenn eine Zahl auf dem Taschenrechner betaetigt wurde
	* Diese Zahl wird der aktuell auf dem Display stehenden Zahl angehaengt
	* @param i Die Ziffer die an den aktuell eingegebenen Operanden angehaengt werden soll
	*/
	private void zahlAnhaengen (String i) {
		model.setOperand(model.getOperand() + i);
		view.update();
	}
	
	/**
	* Wird aufgerufen, wenn eine Operatoraste, -, /, *) betaetigt wurde
	* @param i Der eingegebene Operator (+, -, /, *)
	*/
	
	private void setRechenzeichen (String i) {
		model.setOperator(i);
		view.update();
	}
	
	/**
	* Wird aufgerufen, wenn die C Taste auf einem Taschenrechner
	* betaetigt wurde.
	*/
	private void loeschen() {
		model.clear();
		view.update();
	}
	
	/**
	* Wird aufgerufen, wenn die = Taste auf einem Taschenrechner betaetigt wurde.
	*/
	private void berechnen() {
		model.berechne();
		view.update();
	}
}
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben