Einfacherer Taschenrechner, ActionListener funzt nicht.

Status
Nicht offen für weitere Antworten.

NichtSchlau

Mitglied
Hab mich mal durch Java 2 für Dummies durchgeprügelt und danach versucht einen Taschenrechner zu basteln, es funzt eigentlich alles, nur der Klick auf ein anderes Zeichen als einer Zahl führt zu Fehlern.


2 Fehlermeldungen:


1. offnet sich ein neuer Tab mit folgendem:
ss_FehlermeldungInTab.jpg


Wenn ich auf Attach Source klicke kommt:
hlerim_AcitonListener.jpg


Das Kapiere ich überhaupt nicht, da ich rt.jar nirgendsverwende....


2. kommt in der Konsole folgende Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at taschenrechner.TaschenrechnerPanel.calculate(TaschenrechnerPanel.java:107)
at taschenrechner.TaschenrechnerPanel$BefehlsAktion.actionPerformed(TaschenrechnerPanel.java:98)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Hier ist der Code der Klasse Taschenrechner
Java:
package taschenrechner;


import javax.swing.*;



public class Taschenrechner
{
   


	static private JFrame Fenster = new JFrame();
	static private TaschenrechnerPanel Panel = new TaschenrechnerPanel(); 


    public static void main(String[] args)
    {
        Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Fenster.setVisible(true);
        Fenster.setTitle("Einfacher Gammeltaschenrechner");
        Fenster.add(Panel);
        Fenster.pack();
        
    }
}


Hier der Code vom TaschenrechnerPanel

Java:
package taschenrechner;

import java.awt.*;
import java.awt.event.*;



import javax.swing.*;


public class TaschenrechnerPanel extends JPanel
{


		private JButton Display = new JButton("0");
		private JPanel Tastenkonsole = new JPanel();
		private JButton Knopf;
		private ActionListener Eingabe = new EingabeAktion();
		private ActionListener Befehl = new BefehlsAktion();
		private double Ergebnis;
		private String letzterBefehl;
		private boolean erster = true;
 

	
		public TaschenrechnerPanel()
		{
				setLayout(new BorderLayout());
				Display.setEnabled(false);
				add(Display, BorderLayout.NORTH);
		
				Tastenkonsole.setLayout(new GridLayout(4, 4));
				add(Tastenkonsole, BorderLayout.CENTER);
				Tastenkonsole.setLayout(new GridLayout(4,4));
		

		
				neuerKnopf("7", Eingabe);
				neuerKnopf("8", Eingabe);
				neuerKnopf("9", Eingabe);
				neuerKnopf("/", Befehl);
				neuerKnopf("4", Eingabe);
				neuerKnopf("5", Eingabe);
				neuerKnopf("6", Eingabe);
				neuerKnopf("*", Befehl);
				neuerKnopf("1", Eingabe);
				neuerKnopf("2", Eingabe);
				neuerKnopf("3", Eingabe);
				neuerKnopf("-", Befehl);
				neuerKnopf("0", Eingabe);
				neuerKnopf(".", Eingabe);
				neuerKnopf("=", Befehl);
				neuerKnopf("+", Befehl);
		}
	
		private void neuerKnopf(String Name, ActionListener listener)
		{
				Knopf = new JButton(Name);
				Knopf.addActionListener(listener);
				Tastenkonsole.add(Knopf);
		}

		private class EingabeAktion implements ActionListener
		{
				public void actionPerformed(ActionEvent event)
				{
						String input = event.getActionCommand();
						if (erster)
						{
								Display.setText("");
								erster = false;
						}
						Display.setText(Display.getText() + input);
				}
		}
	
		private class BefehlsAktion implements ActionListener
		{
				public void actionPerformed(ActionEvent event)
				{
						String command = event.getActionCommand();
	 
						if (erster)
						{
								if (command.equals("-"))
								{
										Display.setText(command);
										erster = false;
								}
								else
									letzterBefehl = command;
						}
						else
						{
								
								calculate(Double.parseDouble(Display.getText()));
								letzterBefehl = command;
								erster = true;
						}
				}
		}

		public void calculate(double x)
		{
			if (letzterBefehl.equals("+")) Ergebnis += x;
			else if (letzterBefehl.equals("-")) Ergebnis -= x;
			else if (letzterBefehl.equals("*")) Ergebnis *= x;
			else if (letzterBefehl.equals("/")) Ergebnis /= x;
			else if (letzterBefehl.equals("=")) Ergebnis = x;
			Display.setText("" + Ergebnis);
	   }
}



Ich hab das ganze Projekt für Eclipse als Zip angehängt, um den edlen Helden, von denen ich mir Hilfe erhoffe die Arbeit zu erleichtern :toll:



Danke für die Antworten im voraus.



Mit freundlichem Gruße.
 
Zuletzt bearbeitet:
rt.jar ist ein teil vom JRE xD
eclipse versucht den source von ActionListener zu öffnen und findet diesen nicht. das hat nix mit deinem programm zu tun (der source ist übrigens im sdk ordner als src.zip falls es dich interessiert)

zu deinem fehler du hast nen nullpointer in zeile 107 von TascheRechnerPanel scheint als wäre "letzterBefehl" null aso nicht initialisiert
 
Mkay, danke, joah, und warum ist letzerBefehl leer?
Im Listener Befehlsaktion fülle ich ihn doch mit command?


Das der er den ActionListener nicht findet kann nicht sein, da Zahleneingaben ja Funktionieren, der Obere Listener für Zahlen, welcher auch vom ActionListener abgeleitet wird funzt also.


MfG
 
Zuletzt bearbeitet:
es findet nur den sourcecode der klasse ActionListener nicht das ist auch nicht dragisch den braucht man ja auch nicht

sieht so aus als würdest du letzterBefehle nix zuweisen wenn "!erster" ist
lass dir mal zu beginn der calculate methode letzerBefehl ausgeben nicht das ich mich irre
 
es findet nur den sourcecode der klasse ActionListener nicht das ist auch nicht dragisch den braucht man ja auch nicht

sieht so aus als würdest du letzterBefehle nix zuweisen wenn "!erster" ist
lass dir mal zu beginn der calculate methode letzerBefehl ausgeben nicht das ich mich irre



Verzeih der doofen Frage, aber es gibt für Java doch sicher sowas wie var_dump/ print_f (die sind von PHP), was einem dem Wert in der Konsole ausgibt, damit ich nicht extra ein neues Feld mit ausgabe machen muss.

Wie macht man das in Java?

MfG
 
System.out.println("blablubb"); in eclipse kannste aber auch syso eingeben und strg+leertaste drücken dann schreibt es dir das xD
 
Thx, command allerdings ist gefüllt, und zwar mit dem entsprechendem Zeichen.
letzterBefehl wird mit command gefüllt.

Der Fehler muss irgendwo in dem Listener Befehlsaktion liegen, der erste Listener funzt schließlich auch.
Ich bin ein wahrer Künsterl, mache sogar in einem popeligem Taschenrechner Fehler 😳

MfG
 
Zuletzt bearbeitet:
In EingabeAktion setzt du "erster" auf false sobald du ne zahl eingibst (beziehungsweise auch beim minus)
wenn du nun Befehlsaktion aufrufst wird nur
Java:
   calculate(Double.parseDouble(Display.getText()));
   letzterBefehl = command;
    erster = true;
ausgeführt. letzterBefehl ist also noch null bei calculate
Lösung: oben statt
Java:
String letzterBefehl;
Java:
String letzterBefehl = "";
schreiben und die calculate methode wie folgt verändern:
Java:
public void calculate(double x) {
		if (letzterBefehl.equals("+"))
			Ergebnis += x;
		else if (letzterBefehl.equals("-"))
			Ergebnis -= x;
		else if (letzterBefehl.equals("*"))
			Ergebnis *= x;
		else if (letzterBefehl.equals("/"))
			Ergebnis /= x;
		else if (letzterBefehl.equals("="))
			Ergebnis = x;
		else return;
		Display.setText("" + Ergebnis);
	}
(bewirkt das die methode bei andren werten für letzterBefehl abgebrochen wird)

edit: scheinbar gibts beim "-" noch probleme
 
In EingabeAktion setzt du "erster" auf false sobald du ne zahl eingibst (beziehungsweise auch beim minus)
wenn du nun Befehlsaktion aufrufst wird nur
Java:
   calculate(Double.parseDouble(Display.getText()));
   letzterBefehl = command;
    erster = true;
ausgeführt. letzterBefehl ist also noch null bei calculate
Lösung: oben statt
Java:
String letzterBefehl;
Java:
String letzterBefehl = "";
schreiben und die calculate methode wie folgt verändern:
Java:
public void calculate(double x) {
		if (letzterBefehl.equals("+"))
			Ergebnis += x;
		else if (letzterBefehl.equals("-"))
			Ergebnis -= x;
		else if (letzterBefehl.equals("*"))
			Ergebnis *= x;
		else if (letzterBefehl.equals("/"))
			Ergebnis /= x;
		else if (letzterBefehl.equals("="))
			Ergebnis = x;
		else return;
		Display.setText("" + Ergebnis);
	}
(bewirkt das die methode bei andren werten für letzterBefehl abgebrochen wird)

edit: scheinbar gibts beim "-" noch probleme



Vielen Dank, ich leg bei Gott n gutes wort für dich ein 😀 :bae:


MfG
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben