getSource() findet Button nicht - ActionListener

MarkusKirch

Mitglied
Hallo!
Ich habe folgendes kleines Programm geschrieben!
Es ist nicht das erste mla, dass ich mit dem AL arbeite, doch diesesmal will er einfach nicht...
Obwohl alle Buttons feinsäuberlich deklariert und erzeugt wurde, gibt er folgende NullPointerException:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at einarmigerBandit.zaehlen(einarmigerBandit.java:77)
	at einarmigerBandit.actionPerformed(einarmigerBandit.java:110)
	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)

Dies ist mein Programmcode:

Java:
// Import der Bibliotheken
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

// Erstellen der Kklasse
public class einarmigerBandit implements ActionListener {
	// Deklarieren der einzelnen Objekte
	public JFrame f;
	public TextField zufallsZahl, laufendeZahl;
	public JLabel titel, ausgabe;
	public Font titelFont=new Font("Arial", 1, 17);
	public Font felderFont=new Font("Arial", 1, 26);
	public int laufendesInt, Differenz, Zufall1_100;
	public boolean stoppNichtGedrueckt;
	public JButton stopp, start, ende;
	
	// Konstruktormethode öffnen
	public void einarmigerBandit() {
		JFrame f=new JFrame("einarmiger Bandit");
		f.setSize(300, 350);
		f.setVisible(true);
		f.setLayout(null);
		stoppNichtGedrueckt=true;
		laufendesInt=1;
		
		JLabel titel=new JLabel("einarmiger Bandit");
		titel.setBounds(75, 50, 150, 50);
		titel.setFont(titelFont);
		f.add(titel);
		
		JLabel ausgabe=new JLabel("x");
		ausgabe.setBounds(0, 0, 150, 30);
		f.add(ausgabe);
		
		TextField eigeneZahl=new TextField();
		eigeneZahl.setBounds(75, 100, 50, 35);
		eigeneZahl.setEditable(false);
		eigeneZahl.setFont(felderFont);
		zufall();
		eigeneZahl.setText(String.valueOf(Zufall1_100));
		f.add(eigeneZahl);
		
		TextField zufallsZahl=new TextField();
		zufallsZahl.setBounds(175, 100, 50, 35);
		zufallsZahl.setText(String.valueOf(laufendesInt));
		zufallsZahl.setFont(felderFont);
		zufallsZahl.setEditable(false);
		f.add(zufallsZahl);
		
		stopp=new JButton();
		stopp.setText("Stopp");
		stopp.setBounds(75, 160, 150, 50);
		stopp.addActionListener(this);
		f.add(stopp);
		
		start=new JButton();
		start.setText("Start");
		start.setBounds(155, 250, 70, 30);
		start.addActionListener(this);
		f.add(start);
		
		ende=new JButton();
		ende.setText("Ende");
		ende.setBounds(75, 250,  70, 30);
		ende.addActionListener(this);
		f.add(ende);
		
		f.repaint();
	}
	
	public void zaehlen() {
		if(laufendesInt==99) {
			laufendesInt=1;
		}
		laufendesInt++;
		laufendeZahl.setText(String.valueOf(laufendesInt));
		System.out.println(laufendesInt);
		f.validate();
		f.repaint();
//		try{
//			Thread.sleep(100);
//		} catch(Exception e) {
//			System.out.println("Es konnte nicht gewartet werden!");
//		}		
	}
	
	public void pruefen() {
		Differenz=Math.abs(Integer.valueOf(zufallsZahl.getText())-Integer.valueOf(laufendeZahl.getText()));
		if(Differenz<=10) {
			ausgabe.setText("Nicht schlecht!");
		}
		if(Differenz<=5) {
			ausgabe.setText("Fast!");
		}
		if(Differenz==0) {
			ausgabe.setText("Gewonnen!");
		}
		f.repaint();
	}
	
	public void zufall() {		
		Zufall1_100=(int)(Math.random()*100)+1;
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==start) {
			stoppNichtGedrueckt=true;
			while(stoppNichtGedrueckt==true) {
				zaehlen();
			}
		}else if(e.getSource()==stopp) {
			stoppNichtGedrueckt=false;
			pruefen();			
		}else if(e.getSource()==ende) {
			System.exit(0);
		}
		System.out.println("actionPerformed Methode ausgeführt!");
	}


	
}

Kann jemand von euch vielleicht helfen?

Vielen Dank im Voraus!!!

VG Markus
 
ich denke, dass das textfield "laufendeZahl" null ist, weil es dem stacktrace nach in zeile 77 die ursache ist und du es nirgendwo initialisierst 🙂
 
Atze hat vermutlich Recht und abseits davon ein Hinweis:
[JAVA=18]// Konstruktormethode öffnen
public void einarmigerBandit() {[/code]
Dies ist kein Konstruktor, da der Datentyp hier void ist. Ein Konstruktor sähe z.B. so aus (Klassennamen sollten großgeschrieben werden:
Java:
public einarmigerBandit() {}
 
Ok Leute, vielen Dank für eure Hilfe!
Ich habe zwischendurch die Namen der einzelnen Objekte über Eclpises "Refactoring" Funktion umbenannt, dabei hat eclipse nicht alle Objektaufrufe korrekt umbenannt...

Zum Beispiel wird oben das TextField "eigenZahl" deklariert, das eigenltich "zufallsZahl" heißen muss...
Und das TextField, dass als "zufallsZahl" deklariert wird, heißt eigentlich "laufendeZahl"...

Ich muss heute Mittag wirklich blind gewesen sein, das nicht zu merken...

Trotzdem vielen Dank euch!


VG Markus
 
Ich habe zwischendurch die Namen der einzelnen Objekte über Eclpises "Refactoring" Funktion umbenannt, dabei hat eclipse nicht alle Objektaufrufe korrekt umbenannt...

Zum Beispiel wird oben das TextField "eigenZahl" deklariert, das eigenltich "zufallsZahl" heißen muss...
Und das TextField, dass als "zufallsZahl" deklariert wird, heißt eigentlich "laufendeZahl"...
Hierbei handelt es ich um unterschiedliche Variablen
Code:
zufallsZahl
und
Code:
laufendeZahl
sind Instanzvariable, während
Code:
eigeneZahl
und
Code:
zufallsZahl
lokale nur in der Methode
Code:
einarmigerBandit()
gültig sind.
Daher war die Umbenennung von Eclipse korrekt.

Ansonsten sollte man AWT und Swingkomponenten nicht mischen: TextField ==> JTextField
 

Zurück
Oben