JFrame lokale Variable innere Klasse

Hallo,
Ich habe ein Problem, ich bin dabei ein Programm zu schreiben. Bisher alles gut, doch wenn ich probiere ein Datentyp was vereerben zulassen funktioniert es selbst mit final nicht.
Hier der Code:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class game3d {

  public static void main(String[] args) 
  { 
        int eingabe= 0;
	  
	
	  
    JFrame frame = new JFrame("LuckyGame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
    
    BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS); // top to bottom
    frame.setSize(230, 110);
    frame.setLayout(boxLayout);
    frame.setResizable(false);
    
    
    final JTextField field1 = new JTextField(18); 
    
    JPanel Monitorpanel = new JPanel();/*Panel adden (extra container)*/
    Monitorpanel.add(field1);
    
    frame.add(Monitorpanel); /*Ab hier wieder adden*/
    /*adden beendet*/
    
    
    
    field1.addActionListener(new ActionListener()
    {        /*actionlistener erstellt*/
    	 
        @Override
        public void actionPerformed(ActionEvent e) 
        {  
        	//String to int convert zahl1 hier erstellt
        	int zahl1 = Integer.parseInt(field1.getText());
                //Hier soll int Zahl1 ausgegeben werden
                System.out.println(zahl1);
                eingabe = zahl1; //funktioniert selbst mit final nicht
        }
        
    }
    );/*actionlistener beendet*/
    

    
   
    
    
    
    frame.setVisible(true);
  }
  
  
  
  
  
  
}

Ich hoffe jemand kann mir helfen.

Mit freundlichem Gruß,
MrSmile07

Müsste im Kommentar heißen „funktioniert selbst mit final nicht“ :wink: Scheinbar ist Dir die Bedeutung von final nicht ganz klar: Der Variablen kann nur einmalig ein Wert/Referenz zugeordnet werden.

Die Variable eingabe sollte als Instanzvariable sein. Bzw. da Du ja den ganzen Code in die statische main gepackt hast muss sie hier statisch als Klassenvariable deklariert werden.

vom Listener eine umgebende lokale Variable zu setzen, das ist nicht vorgesehen,
die main-Methode ist anzunehmenderweise längst weg, Variable nicht mehr vorhanden,
es wird nur andersrum (bei final) der Wert bzw. das Objekt übertragen/ gemerkt

du kannst eingabe zu einem statischen oder Instanzattribut machen, längerlebig als eine Methode

oder du setzt in eingabe ein Objekt, einen Container, z.B. ein int[1],
die Variable kannst du dann immer noch nicht ändern, kein neues Array zuweisen, aber das vorhandene Array verwenden,
an die Index-Position 0 jederzeit einen int speichern, lesen, beliebig

Sorry, ich bin noch kein Meister sondern wie in der Beschreibung erwähnt ein Neuling ich kapiere noch nicht alles.
Fakt ist das ich da wo ich die Variable “eingabe” erzeuge (also ausserhalb der inneren Klassen) aussen wieder benutzen kann für den nachfolgenden Code in der main Klasse.

Mit freundlichem Gruß,
MrSmile07

sind dir die zeitlichen Abläufe klar? die main-Methode ist evtl. nach wenigen ms beendet,
während man selbst mit Eile kaum früher als 1 sec später durch Interaktion den ActionListener starten kann,
dann ist die main-Methode weg, Geschichte, verständlich?

freilich ist es auch möglich, die main-Methode noch sehr lange laufen zu lassen,
aber darauf kann die Java-Sprache keine Rücksicht nehmen


wie auch immer, die Lösungen wurden genannt: Attribut oder Container,
das sollte auch als Anfänger zu verstehen sein, einfacher wird es zu diesem Thema nicht mehr (außer vielleicht fertigen Code),

wenn du eine konkrete Nachfrage hast, ‘was ist ein Attribut?’ oder so, dann auch stellen,
besser noch vorher nachschlagen, Beispielcode versuchen usw.,
nicht nur ‘sorry, Bahnhof’ posten, damit kann man wenig anfangen

Das Programm läuft ja, und ich weiß auch dass wenn ich esangezeigt haben will es im Panel einbinden muss, ich habe es aber momentan nur so gemacht das in der Konsole die Zahl ausgegeben wird. Die Variable “eingabe” soll “zahl1” sein damit ich sie im Verlauf des Codes nochmal benutzen kann.

Mit freundlichem Gruß,
MrSmile07

Erklärungen und Alternativen sind gegeben, vielleicht nicht in bester Qualität,
aber der aktuelle Stand ist unmöglich, soviel ist sicher

ersetze mal die Zeilen 19 bis 23 durch diese:```/* zeile 19 */public class game3d { // eigentlich wollen wir groß geschriebene Klassennamen…
int eingabe= 0;

public static void main(String[] args)
{
// Java ist eine objektorientierte Sprache, also erzeugen wir ein Objekt
// und rufen eine seiner Methoden auf.
new game3d().run();
}

private void run() {
/* ab hier mit Zeile 24 weier */```

bye
TT

Danke Timothy_Truckle hat super funktioniert.

Damit sätze ich das Thema auf erledigt.

Mit freundlichem Gruß,
MrSmile07

ich hoffe nur, Du hast auch verstanden warum…

bye
TT