Variablen Variablen in ActionListenern

javaa

Mitglied
Hi Leute, bin grade daran ein Programm zu schrieben und es läuft bisher auch ganz gut, nur häng ich gerade an einer Stelle.
Und zwar möchte ich eine Variable in einem ActionListener definieren, also dass sie quasi bei einem klick auf einen JButton erst definiert wird, und sie dann später mit einem anderen ActionListener auslesen.

Jedoch wird die Variable, wenn ich sie definiere gelb unterkringelt und beim auslesen rot, also als nicht definiert, heißt, dass da irgendwie keine verbindung zwischen beiden besteht. Hat von euch vielleicht jemand eine Ahnung wie sich das Problem lösen lässt?

Hier mal grob skizziert wie der entscheidende Teil des Codes aussieht:

Der erste ActionListener definiert die Variable int zufall, zweite soll sie eigentlich auslesen, klappt aber nicht.
Java:
        public class next implements ActionListener 
	{
					public void actionPerformed(ActionEvent e) {
						int zufall = random.nextInt(frage.fragen[stufe].length);
                                       }										
       }


                         
	public class buttonklick implements ActionListener 
	{
					public void actionPerformed(ActionEvent e) {
		                                System.out.println(zufall);
	}


}
[code=Java]

schonmal danke für jegliche Bemühungen. 
gruß
 
Zuletzt bearbeitet von einem Moderator:
Du solltest die Variable zufall als Instanvariable deklarieren und in der Methode actionPerformed den Wert zuweisen. Außerdem solltest du dafür getter und setter Methoden erstellen. Anschließend kannst du diese von deiner 2. Klasse mit der getter Methode aufrufen.

Da ich doch noch die Zeit hatte hier das was ich gemeint habe. Habs nicht getestet.

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

public class Next implements ActionListener {
	
	private int zufall;
	
	public void actionPerformed(ActionEvent e) {
		zufall = random.nextInt(frage.fragen[stufe].length);
	}

	public int getZufall() {
		return zufall;
	}

	public void setZufall(int zufall) {
		this.zufall = zufall;
	}
}

public class ButtonKlick implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		System.out.println(new Next().getZufall());
	}
}
 
Zuletzt bearbeitet:
Eine Instanzvariable nach dem Klassennamen und vor den Methoden deklariert und ist in der Regel private.

Java:
public class TestKlasse{

private int instanzVariable; // Instanzvariable

public void los(){
// Irgendwas geht los
instanzVariable = 5;
}

}

so ähnlich sollte das aussehen.

Was mir noch aufgefallen ist. Klassennamen sollten Groß im HigherCamelCase und Variable im lowerCamelCase geschrieben werden.
 
mhm.. hab das jetzt mal so eingetippt, aber es funktioniert leider nicht. ich tippe das private int zufall ein und das andere innerhalb des ActionListeners, aber wieder ist irgendwie keine "Verbindung" da.. das eine wird gelb angezeigt und steht vollkommen unabhängig von der anderen Variable.
 
Also, das ist mehr so ein generelles Problem:

Ich habe eine ausführende Klasse, die sieht wie folgt aus:

Code:
class Hauptprogramm {

	
	public static void main(String[] args) throws InterruptedException  {

		new Hauptklasse();
	
	}
	
}

Meine "Hauptklasse" sieht dann wie folgt aus.. hier jetzt mal der ganze Code, das gesamte soll später ein Wer wird Reich ( 😉 ) Spiel werden.
Java:
import java.awt.FlowLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Array;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;

public class Hauptklasse extends JFrame {
	
	java.util.Random random = new java.util.Random();
	
	Fragen frage = new Fragen();
	
	private JLabel infolabel;
	private JLabel fragelabel;
	private JButton buttona;
	private JButton buttonb;
	private JButton buttonc;
	private JButton buttond;
	private JButton ffJoker;
	private JButton teleJoker;
	private JButton publiJoker;
	
	private JButton weiter;
	private JButton neu;
	private JButton spielanf;
	
	
	//Vereinfachung zur Überprüfung von Richtig und Falsch
	private int richtig = 49;
	
	
	//Array und int für Gewinn
	private String gewinn [] = {"0", "50", "100", "200", "300", "500", "1000", "2000", "4000", "8000", "16000", "32000", "64000", "125000", "500000", "1 Mio."};
	private int stufe = 0;
	private int check = 0;
	
	
	
	

	
		
	//Erstellen der Grafischen Benutzeroberfläche
	public Hauptklasse() 
	{	
		
		
		//Allgemeines zum Fenster und Layout
		setLayout (null);
		setTitle("Wer wird Reich?");
		setSize(970,650);
		setResizable(false); 
		
		
		//Initialisieren + Einfügen des Textes auf die Joker
		infolabel = new JLabel();
		fragelabel = new JLabel();
		buttona = new JButton ();
		buttonb = new JButton ();
		buttonc = new JButton ();
		buttond = new JButton ();
		ffJoker = new JButton ("50 : 50");
		teleJoker = new JButton ("Telefonjoker");
		publiJoker = new JButton ("Publikumsjoker");
		
		
		
		
		
		weiter = new JButton ("Nächste Frage!");
		neu = new JButton ("Neues Spiel");
		spielanf = new JButton ("Spiel starten");
		
		
		//Layout und Stil
		infolabel.setBounds(30, 150, 722, 70);
		fragelabel.setBounds(30, 250, 722, 70);
		buttona.setBounds(30, 360, 350, 70);
		buttonb.setBounds(400, 360, 350, 70);
		buttonc.setBounds(30, 450, 350, 70);
		buttond.setBounds(400,450, 350, 70);
		ffJoker.setBounds(500, 100, 100, 70);
		teleJoker.setBounds(610, 100, 100, 70);
		publiJoker.setBounds(720, 100, 100, 70);
		
		weiter.setBounds(610, 300, 100, 70);
		neu.setBounds(610, 300, 100, 70);
		spielanf.setBounds(610, 300, 100, 70);
		
		
		/*
		buttona.setBackground(Color.blue);
		buttona.setForeground(Color.blue);
		buttona.setContentAreaFilled(false);
		buttona.setBorder((Border) new BevelBorder(BevelBorder.RAISED));
		*/
		
		
		//Aktionen definieren
		buttona.addActionListener(new buttonklick());
		buttonb.addActionListener(new buttonklick());
		buttonc.addActionListener(new buttonklick());
		buttond.addActionListener(new buttonklick());
		
		ffJoker.addActionListener(new ffjokerklick());
		teleJoker.addActionListener(new telejokerklick());
		publiJoker.addActionListener(new publijokerklick());
		
		
		weiter.addActionListener(new next());
		neu.addActionListener(new next());
		spielanf.addActionListener(new next());
		
		//Hinzufügen der Elemente / Startbildschrim
		
		
		add(neu);
		add(spielanf);
		add(weiter);
		
		add(fragelabel);
		add(buttona);
		add(buttonb);
		add(buttonc);
		add(buttond);
		add(ffJoker);
		add(teleJoker);
		add(publiJoker);
		add(infolabel);
		
		
		weiter.setVisible(false);
		neu.setVisible(false);
		
		fragelabel.setVisible(false);
		buttona.setVisible(false);
		buttonb.setVisible(false);
		buttonc.setVisible(false);
		buttond.setVisible(false);
		ffJoker.setVisible(false);
		teleJoker.setVisible(false);
		publiJoker.setVisible(false);
		

		
		setVisible(true);
		
	}
	
	
	public class buttonklick implements ActionListener 
	{
					//Definition der einzelnen Ereignisse, wenn eine Frage beantwortet wird
					public void actionPerformed(ActionEvent e) {
						buttona.setEnabled(false);
						buttonb.setEnabled(false);
						buttonc.setEnabled(false);
						buttond.setEnabled(false);
						ffJoker.setEnabled(false);
						teleJoker.setEnabled(false);
						publiJoker.setEnabled(false);
					
// Hier werden die Variablen KonA1 - A4 benötigt, aber sie werden als nicht definiert angezeigt. Genaueres Problem steht weiter unten im Quelltext.
						
							if (e.getSource() == buttona && KonA1 == richtig){
								stufe++;
								infolabel.setText("Das war die richtige Antwort! Ihr aktueller Gewinn beträgt " + gewinn[stufe] +" Euro!");
								weiter.setVisible(true);
							}
							else if (e.getSource() == buttonb && KonA2 == richtig){
								stufe++;
								infolabel.setText("Das war die richtige Antwort! Ihr aktueller Gewinn beträgt nun " + gewinn[stufe] +" Euro!");
								// Abwarten
								weiter.setVisible(true);
								
							}
							else if (e.getSource() == buttonc && KonA3 == richtig){
								stufe++;
								infolabel.setText("Das war die richtige Antwort! Ihr aktueller Gewinn beträgt nun " + gewinn[stufe] +" Euro!");
								// Abwarten
								weiter.setVisible(true);
								
							}
							else if (e.getSource() == buttond && KonA4 == richtig){
								stufe++;
								infolabel.setText("Das war die richtige Antwort! Ihr aktueller Gewinn beträgt nun " + gewinn[stufe] +" Euro!");
								// Abwarten
								weiter.setVisible(true);
							}
							else {
								if (stufe > 10)			{check = 10;}
								else if (stufe > 5 )	{check = 5;}
								else 					{check = 0;}
								
								infolabel.setText("Das war leider die falsche Antwort. Sie gehen mit " + gewinn[check] +" Euro nach Hause!");
								stufe = 0;
								neu.setVisible(true);	
							}
							
							
						if (stufe == 15){
							infolabel.setText("Sie haben es geschafft! Sie gewinnen 1 Millionen Euro!!");
							stufe = 0;
							neu.setVisible(true);
								
							}
								
								
					}
					
	}
	
	
	public class next implements ActionListener 
	{
					//Definition der Ereignisse, wenn die Frage beantwortet wurde
					public void actionPerformed(ActionEvent e) {
						weiter.setVisible(false);
						neu.setVisible(false);
						spielanf.setVisible(false);
						
						fragelabel.setVisible(true);
						buttona.setVisible(true);
						buttonb.setVisible(true);
						buttonc.setVisible(true);
						buttond.setVisible(true);
						ffJoker.setVisible(true);
						teleJoker.setVisible(true);
						publiJoker.setVisible(true);
						
						weiter.setVisible(false);
						neu.setVisible(false);
						spielanf.setVisible(false);
						
						fragelabel.setEnabled(true);
						buttona.setEnabled(true);
						buttonb.setEnabled(true);
						buttonc.setEnabled(true);
						buttond.setEnabled(true);
						ffJoker.setEnabled(true);
						teleJoker.setEnabled(true);
						publiJoker.setEnabled(true);
						
						int zufall = random.nextInt(frage.fragen[stufe].length);
					

						fragelabel.setText(frage.fragen [stufe] [zufall]);
						buttona.setText(frage.antworten[stufe] [zufall] [0]);
						buttonb.setText(frage.antworten[stufe] [zufall] [1]);
						buttonc.setText(frage.antworten[stufe] [zufall] [2]);
						buttond.setText(frage.antworten[stufe] [zufall] [3]);
						


// Hier liegt der große Fehler, ich definiere die Variablen KonA1 - A4, das klappt soweit auch wunderbar, doch sobald ich sie beim klick auf den anderen Button (oben bei ActionListener) wieder aufrufen will, funktioniert das nicht, woran kann das denn liegen? 



						int KonA1 = frage.antworten[stufe] [zufall] [0].charAt(0);
						int KonA2 = frage.antworten[stufe] [zufall] [1].charAt(0); 
						int KonA3 = frage.antworten[stufe] [zufall] [2].charAt(0); 
						int KonA4 = frage.antworten[stufe] [zufall] [3].charAt(0); 
						
						
					
}
					
	}					
					
					
				
							  

}

Mein Problem hab ich als Kommentar im Quellcode geschrieben.
ich bin euch dankbar für jede Hilfe, muss das übermorgen haben:/
 
Also, das ist mehr so ein generelles Problem
Ja, das fehlende Verständnis für den Gültigkeitsbereich von Variablen ;-)
Wie weiter oben bereits erwähnt, liegt der Fehler darin, dass die Variablen in der einen Methode deklariert werden, heißt sie gelten auch nur innerhalb dieser Methode. "Erschwerend" kommt noch dazu, dass diese Methode eine Methode einer anonymen inneren Klasse ist.
Die Lösung (wurde ebenfalls bereits genannt) wäre die Variablen "global" in der
Code:
Hauptklasse
zu deklarieren, wie z.B. die Variable
Code:
infoLabel
. Dann könnte man auch überall darauf zu greifen.
 
boaaaaah, ich danke dir!!! sieht soweit echt gut aus, nur noch ein letztes Problem hab ich, dann ist mein Prgramm perfekt.

Ich möchte, dass ein String aus einem Array ausgelesen wird und auf ein Button projektziert wird (klappt auch wunderbar), einzige Probelm, dass bleibt ist, dass ich immer das erste Zeichen des Strings gelöscht haben möchte. Wie geht das?
Hab nach ewig langem googeln eine Variante mit char und ner for Schleife gefunden.. diese verstehe ich aber leider nicht so ganz.
Wäre cool wenn von euch jemand helfen könnte.
gruß
 
einzige Probelm, dass bleibt ist, dass ich immer das erste Zeichen des Strings gelöscht haben möchte. Wie geht das?
Hab nach ewig langem googeln eine Variante mit char und ner for Schleife gefunden.. diese verstehe ich aber leider nicht so ganz.
Es gibt auch die String Methode substring:
Java:
System.out.println("Hallo".substring(1));
 
Hahhaah 😀 nieeemals geglaubt, dass das so einfach geht. Fettes Dankeschön an Alle!!!! ihr seit die besten, Programm läuft!!

:applaus::applaus::applaus::applaus:
 

Zurück
Oben