String außerhalb der main-Methode

Michaelis

Mitglied
Hallo zusammen,
ich bin noch ein absoluter neuling in Java.
nun habe ich folgenden Code, der aber aufgrung einer String Variable nicht funktioniert.
Es handelt sind um den String question!
Problem ist, der String funktioniert nur innerhalb der main-Methode, ich muss ich brauche ihn aber innerhalb jbok_ActionPerformed.(ganz unten)
PS: ich bin noch ein neuling, dass ich bis dahin gekommen bin ist eigendlich nur Gück.
Code:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
*
* Beschreibung
*
* @version 1.0 vom 17.11.2019
* @author Michaelis
*/


  public class fenster extends JFrame {
   

    private static final long serialVersionUID = 1L;

public static void main(String[] args) {
    String question;
 
//    String answer;
 

    int anzahl = 5;
    int randomint = (int) (Math.random()*anzahl);
 
    String[] frage = {"A", "B", "C", "D","E"};
 
 
//    String[] antwort = {"1", "2", "3", "4","5"};
//    jcbanswer = new JComboBox<String>(antwort);
    question = frage[randomint];
//    answer = antwort[randomint];
 
    lQuestion.setText(question);
    lQuestion.setOpaque(false);
 
//    test
//    System.out.println(question);
//    System.out.println(answer);
 
    new fenster();
 

  } // end of main

  public static String question;


//Anfang Attribute
private JLabel jlatmung = new JLabel();
private static JLabel lFalsch = new JLabel();
private static JLabel lRichtig = new JLabel();
private JButton jbok = new JButton();
public ComboBoxModel<String> antwort;
public static JComboBox<String> jcbanswer = new JComboBox<String>();
public DefaultComboBoxModel<String> jcbanswerModel = new DefaultComboBoxModel<String>();
private JLabel lFrage = new JLabel();
private JLabel lAntwort = new JLabel();
public static JLabel lQuestion = new JLabel();



// Ende Attribute

public fenster() {
    // Frame-Initialisierung
    super();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 800;
    int frameHeight = 500;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setTitle("Quiz");
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
 
// Anfang Komponenten

    jlatmung.setBounds(216, 0, 301, 100);
    jlatmung.setText("Atmung");
    jlatmung.setForeground(Color.BLUE);
    jlatmung.setFont(new Font("@Microsoft YaHei", Font.BOLD, 72));
    cp.add(jlatmung);
    lFalsch.setBounds(8, 6, 188, 88);
 
    lFalsch.setForeground(Color.RED);
    lFalsch.setFont(new Font("Dialog", Font.BOLD, 36));
    lFalsch.setHorizontalAlignment(SwingConstants.CENTER);
    cp.add(lFalsch);
    lRichtig.setBounds(544, 8, 166, 84);
 
    lRichtig.setFont(new Font("Dialog", Font.BOLD, 36));
    lRichtig.setForeground(Color.GREEN);
    lRichtig.setHorizontalAlignment(SwingConstants.CENTER);
    cp.add(lRichtig);
    jbok.setBounds(256, 368, 193, 65);
    jbok.setText("Prüfen");
    jbok.setMargin(new Insets(2, 2, 2, 2));
    jbok.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          jbok_ActionPerformed(evt);
      }
    });
    jbok.setCursor(new Cursor(Cursor.HAND_CURSOR));
    jbok.setFont(new Font("Dialog", Font.BOLD, 20));
    jbok.setForeground(Color.BLUE);
    cp.add(jbok);
    jcbanswer.setModel(jcbanswerModel);
    jcbanswer.setBounds(152, 243, 550, 36);
    jcbanswer.setBackground(Color.WHITE);
    jcbanswer.setCursor(new Cursor(Cursor.HAND_CURSOR));
    jcbanswer.setFont(new Font("Dialog", Font.BOLD, 12));
    cp.add(jcbanswer);
    lFrage.setBounds(15, 153, 118, 36);
    lFrage.setText("Frage:");
    lFrage.setFont(new Font("Dialog", Font.BOLD, 24));
    //Antworten eingeben
    jcbanswerModel.addElement("A");
    jcbanswerModel.addElement("B");
    jcbanswerModel.addElement("C");
    jcbanswerModel.addElement("D");
    jcbanswerModel.addElement("E");
    cp.add(lFrage);
    lAntwort.setBounds(16, 240, 110, 36);
    lAntwort.setText("Antwort:");
    cp.add(lAntwort);
    lQuestion.setBounds(155, 155, 550, 36);
//    lQuestion.setText(question);
    lQuestion.setFont(new Font("Dialog", Font.BOLD, 12));
//    lQuestion.setBackground(Color.WHITE);
    lQuestion.setOpaque(true);
    cp.add(lQuestion);
    // Ende Komponenten

setVisible(true);
} // end of public Quiz

static // Anfang Methoden
int rcounter = 0;
static int fcounter = 0;


  public final static void jbok_ActionPerformed(ActionEvent evt) {
   
      String selectedItem = (String)jcbanswer.getSelectedItem();
      System.out.println(selectedItem);
      System.out.println(question);//AN DIESER STELLE KANN QUESTION NICHT ABGERUFEN WERDEN (NULL)
      if (selectedItem == question) {
     
        rcounter++;
        lRichtig.setText(String.valueOf(rcounter));
    } else {
     
        fcounter++;
        lFalsch.setText(String.valueOf(fcounter));
    }
      //test
//      System.out.println(selectedItem);
   
   
   
  } // end of jbok_ActionPerformed

  // Ende Methoden
} // end of class Quiz
 
Also Du solltest static nur da verwenden, wo es wirklich notwendig ist. So muss die Methode jbok_ActionPerformed nicht statisch sein. Denn die Methode nicht statisch ist, dann kann sie auch auf die Instanzvariablen der Instanz von fenster (btw: Klassen bitte mit Großbuschtaben anfangen!) zugreifen. Also kann die Variable question von einer lokalen Variable der Methode main zu einer Instanzvariable gemacht werden.
Dann ist aber auch notwendig, dass Du mehr mit der Instanz von fenster machst, denn um auf question zuzugreifen brauchst ja schon eine Instanz von fenster. Hier bietet sich aus meiner Sicht an:
main erzeugt nur die Instanz von fenster und nutzt diese dann für weitere Aufrufe. Das bedeutet, dass main wirklich nichts an Logik enthält außer eben die eigentliche Erzeugung von der Instanz und damit dem eigentlichen Start der Applikation.
 
Habe das Static aus Action Performed gelöscht.
Habe mich über Instanzvariablen informiert, aber ich sehe keinen Unterschied zu "normalen" variablen oder ist das das selbe?
 
Also ich habe die ganzen Variablen (Instanzvariablen, lokale Variablen, ...) nie als unnormal empfunden. Für mich sind das alles (normale) Variablen.

Und ja: es gibt große Unterschiede zwischen lokalen Variablen und Instanzvariablen.
 

Zurück
Oben