Variablenübergabe und ActionListener

Menelao

Grünschnabel
Hallo Zusammen,
bin am Wochenende auf ein "kleines" Problem gestossen, bei dem ich durch probieren, tüfteln und googlen einfach nicht weiter komme.

Die Situation:
Ich hab ein einfaches GUI mit einem Button drauf. Klickt man auf den Button soll beginnend von einem Startwert bei jedem drücken den Wert 3 addiert werden.
Zum überprüfen ob dies wirklich gemacht wird, hab ich ein "System.out.println".

Problemerkennung:
Also eigentlich weiss ich wo das Problem liegt. Ich muss dem Skript irgendwie erklären, dass er meine Variabel zwischen dem "main" und dem "actionPerformed" hin und her schiebt.
Die Variabelnübergabe zwischen "normalen" Methoden kenne ich, aber dies scheint bei dieser "spezial" Methode nicht zu gehen. (?)

Evtl. hat jemand ja eine gute Idee :)
[
Code:
public class Versuch {
	public static void main(String[] args) {
		
			
		// Fenster erstellen
		JFrame fenster = new JFrame("Fenster mit Menuleiste");
		fenster.setSize(1000, 500);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Beim schliessen des Fensters --> Programm beenden
		//Panel
		Panel panel= new Panel();
		fenster.add(panel);
		// Button
		JButton ButtonDatenEinlesen = new JButton("Daten Einlesen");
		panel.add(ButtonDatenEinlesen);
		
		//Variabel
		 int Variabel =0;
		
		//Action
		ButtonDatenEinlesen.addActionListener(new ActionListener() {
			public void  actionPerformed(ActionEvent e) {
				Variabel = Variabel +3;
				System.out.println("Ich addiere der Variabel 3 und dies gibt den neuen Wert der Variabel = " +Variabel);// Zur Kontrolle den Wert ausgeben
			}});

Anmerkung:
1) Der obige Code ergibt die Fehlermeldung: Cannot refer to a non-final variable Variabel inside an inner class defined in a different method.

2) Ich hab in den Textbooks sowie beim googlen verschiedene Beispiele gefunden, bei denen dieses "Problem" gelöst wurde, indem die Variable hin und her geschoben wurde über ein Label oder eine Textfeld. Aber dies möchte ich nicht.
 
Lager doch mal deinen ActionListener in eine Eigene Methode oder Klasse aus und deklariere deine Zählervariable außerhalb der main Methode.
Die main-Methode sollte eigentlich nur zum Starten des Programms dienen. Auch die GUI ist bei einem guten Programmierstil vom Code getrennt.
 
Hallo,

mal abgesehen davon was Matze gesagt, womit er recht hat, denke ich, dass es nur ein Test-Programm sein soll.

Du könntest das hier so lösen
Code:
ButtonDatenEinlesen.addActionListener(new ActionListener() {
   int Variabel = 0;
			public void  actionPerformed(ActionEvent e) {
				Variabel = Variabel +3;
				System.out.println("Ich addiere der Variabel 3 und dies gibt den neuen Wert der Variabel = " +Variabel);// Zur Kontrolle den Wert ausgeben
			}});

MFG

Sascha
 
Danke für die Tipps.

Ich hab mal versucht den Vorschlag von Matze umzusätzen. (Stimmt, sollte mich bemühen um einen besseren Schreibstil zu erlangen.. )
However.. anbei mein korrigiertes Skript und um einen weiteren Button erweitert ... falls jemand anderem der Schuh an selber stelle drückt.

Code:
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Versuch {
	public int Variabel =0;
	
	public static void main(String[] args) {
		Versuch demo = new Versuch( ); 
		demo.gui();
	}
		public void gui ()//Erstellt ein einfaches GUI mit 2 Buttons
		{	
		// Fenster erstellen
		JFrame fenster = new JFrame("Fenster mit Menuleiste");
		fenster.setSize(1000, 500);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Beim schliessen des Fensters --> Programm beenden
		//Panel
		Panel panel= new Panel();
		fenster.add(panel);
		// Button1
		JButton Button1 = new JButton("Daten Einlesen");
		panel.add(Button1);
		//Button2
		JButton Button2 = new JButton("Daten Einlesen");
		panel.add(Button2);
		 		
		
		//Action
		Button1.addActionListener(new ActionListener() {
			public void  actionPerformed(ActionEvent e) {
				Variabel = Variabel +3;
				System.out.println("Ich addiere der Variabel 3 und dies gibt den neuen Wert der Variabel = " +Variabel);// Zur Kontrolle den Wert ausgeben
			}});
		Button2.addActionListener(new ActionListener() {
			public void  actionPerformed(ActionEvent e) {
				Variabel = Variabel -3;
				System.out.println("Ich addiere der Variabel -3 und dies gibt den neuen Wert der Variabel = " +Variabel);// Zur Kontrolle den Wert ausgeben
			}});
	
		}	
}

Mein Problem ist hiermit gelöst. Falls jedoch jemand noch nee Idee hat, wie man den Bereich "Action" in eine Methode einbinden kann, bin ich offen dafür.
 
Einziger Tipp von mir wäre noch jetzt alles sinnvoll in Klassen aufzuteilen: z.b. die main in eine "Starterklasse", dann eine Klasse für die Gui und eine MyActionListener Klasse.
 
Zurück