Compiler-Fehler Button cannot be resolved or is not a field

koni1996

Mitglied
Guten Abend zusammen,

beim Basteln eines einfachen Fensters mit einem Button auf den man klicken kann, sodass eine Meldung "Der Button wurde geklickt" erscheint, tritt ein Fehler auf, den ich nicht verstehe.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class FensterMitButton implements ActionListener
{
	public FensterMitButton()
	{		
		JFrame fenster = new JFrame();
		fenster.setTitle("Fenster mit Button");
		fenster.setLocation(50, 50);
		fenster.setSize(500, 500);
		fenster.setVisible(true);
		
		JButton button = new JButton();
		button.setText("Klick mich!");
		button.addActionListener(this);
		
		JPanel zeichenfenster = new JPanel();
		zeichenfenster.add(button);
		
		fenster.add(zeichenfenster);
	}
	
	public static void main(String[] args)
	{
		FensterMitButton fmb = new FensterMitButton();
	}
	
	public void actionPerformed (ActionEvent ae)
	{
            if(ae.getSource() == this.button)
        {
            System.out.println("Der Button wurde angeklickt.");
        }
    }
}

Der Fehler tritt in Zeile 35 auf.
Wäre schön, wenn mir jemand weiterhelfen könnte.
 
Zuletzt bearbeitet:
Hallo,

erstmal: Objekte mit [c]==[/c] zu vergleichen ist in der Regel voll verboten. Es muss heißen [c]ae.getSource().equals(this.button)[/c]. Du willst denke ich mal den Inhalt vergleichen, nicht die Referenz.

Der Fehler liegt daran, dass du die Variable button im Konstruktor deklariert hast und es deswegen eine lokale Variable ist. Du musst die Variable außerhalb des Konstruktors deklarieren:
[JAVA=9]JButton button;
public FensterMitButton()
{
// ...
button = new JButton();
button.setText("Klick mich!");
button.addActionListener(this);
// ...
[/code]
 
Zuletzt bearbeitet:
Hi,
das Problem ist, dass du in der Methode actionPerformed () auf den button zugreifen möchtest, aber die Instanz nicht bekannt ist. Du hast im Konstruktor FensterMitButton() zwar eine Instanz button, aber diese ist nur innerhalb vom Konstruktor gültig. Ausserhalb, als in der actionPerformed() ist button nicht bekannt. (wurde soeben von Lars789852 erklärt)
Du kannst das so machen:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class FensterMitButton implements ActionListener {
	private JButton button;
	private JLabel label;
	
	public FensterMitButton() 	{      
		JFrame fenster = new JFrame();
		fenster.setTitle("Fenster mit Button");
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setLocation(50, 50);
		fenster.setSize(500, 500);
		fenster.setVisible(true);

		button = new JButton();
		button.setText("Klick mich!");
		button.addActionListener(this);
		
		label = new JLabel();
		

		JPanel zeichenfenster = new JPanel();
		zeichenfenster.add(button);
		zeichenfenster.add(label);

		fenster.add(zeichenfenster);
	}

	public static void main(String[] args) 	{
		FensterMitButton fmb = new FensterMitButton();
	}

	public void actionPerformed (ActionEvent ae) 	{
		if(ae.getSource().equals(button)) 		{
			label.setText("Der Button wurde angeklickt.");
			System.out.println("Der Button wurde angeklickt.");
		}
	}
}
 
Zuletzt bearbeitet:
wow ... wenn zwei unwissende versuchen einem anfänger zu helfen ... kommt sowas bei raus

1) wenn man globale ActionListener nutzt (was man eigentlich nicht machen sollte) kann man schon ruhig einen direkten referenzvergleich mit "==" machen, weil man ja wissen möchte ob das event auch wirklich von dieser einen bestimmten quelle ausgelöst wurde
außerdem : in der langen kette von klassen bis hin zu JButton wird equals() nie überschrieben, es wird also direkt bis auf Object.equals(Object) delegiert, und das ist, wie wir alle wissen, mit "return (this == object)" implementiert
es macht in diesem fall also nicht mal einen unterschied vom ergebnis

2) es ist hier zwar nicht das thema, aber dennoch sollte man einen anfänger darauf hinweisen das der code er geschrieben hat nicht wirklich das pralle vom ei ist
dazu gehört sowohl das "implements ActionListener" was die ganze klasse zu einem Listener macht, und DAS macht man schon mal überhaupt nicht, sowie aber auch das man, wenn man schon mit GUI arbeitet, "setVisible()" grundsätzlich immer als letztes zu callen ist
sonst kann es halt mal passieren das komponenten, obwohl korrekt hinzugefügt, nicht gezeichnet werden

euch fehlt allen drei noch einiges an wissen und erfahrung ...
 
Dann hast du wohl das "in der Regel" überlesen, denn bei z.B. Strings ist das so eine Sache. Es geht zwar wegen dem "String Pool", aber es ist trotzdem nicht empfohlen.

Sehr interessant, dass du unseren Wissensstand an den Aussagen festmachst, wobei in meinem Beitrag fachlich nichts Falsches enthalten war. Es ist zwar egal, ob man == oder equals schreibt, wie du schon anhand des Quellcodes belegt hast, letztendlich galt schon immer und gilt heute noch das equals für Objekte. Wenn das Vergleichen der Referenz genügt, weiß das Objekt das auch selber mithilfe der equals Methode, was in den Swing Klassen implementiert ist, wie du ebenfalls belegt hast.

dazu gehört sowohl das "implements ActionListener" was die ganze klasse zu einem Listener macht, und DAS macht man schon mal überhaupt nicht
Echt? Hätte ich nicht gedacht, da es in zahlreichen Codebeispielen zum ActionListener Gang und Gäbe ist, unter anderem im Java Tutorial von Oracle... Man kann natürlich auch für jeden Button seine eigene anonyme innere Klasse schreiben, wenn man den Quellcode in die Länge ziehen möchte...
 
zum oracle tutorial : die schreiben auch selbst so einen schrott wie "extends JFrame" ... und in einer anderen sektion schon gleich wieder das man das nicht machen soll
und da da mit sicherheit mehrere leute dran geschrieben haben sieht man was bei rauskommen kann
es sind quick'n'dirty beispiele um funktionsweisen zu erklären
aber in einer sauber programmierten app oder lib wirst du sowas nicht finden (zumindest solltest du es nicht)

das man "normalerweise" equals() nutzt um, wie du sagst, den INHALT von objekten zu vergleichen ist mir durch aus bekannt, aber wenn entweder direkt an Object.equlas(Object) delegiert wird da nicht überschrieben oder man halt nicht den inhalt sondern wirklich die referenz prüfen will nutzt man der einfachheit halb direkt "=="
gut, hat eher weniger mit wissen als mit erfahrung zu tun

das die posts fachlich korrekt sind würde ich nicht sagen, und auch als fehlerfrei würde ich sie nicht bezeichnen, auch wenn soweit syntaktisch funktionsfähig
es gibt nun mal gewisse grundregeln was man, auch wenn es möglich ist, schlicht nicht macht, und dazu gehören nunmal dinge wie public class extends JFrame implements ActionListener ... oder sich so verkrampft an vorgaben a la Object.equals() zu klammern


und an sowas kann man sehr wohl den wissens- und erfahrungs-stand festmachen
 

Neue Themen


Zurück
Oben