Frage von Dieter987, 64

Variablenzugriff in Java?

Hallo,

ich habe folgenden Quelltext: Ich möchte im ActionListener 3 auf die Variable berechnung im ersten ActionListener zugreifen. Wie kann ich das machen?

Vielen Dank im Voraus

ActionListener al =new ActionListener(){
        public void actionPerformed(ActionEvent e){
            ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
             String text = ((JButton)e.getSource()).getText();
             field.setText(field.getText()+text);
             
         try {
                // Evaluate the expression
                Object result = engine.eval(field.getText());
                String berechnung = String.valueOf(result);
                System.out.println(result);
            }
            catch (ScriptException h) {
                System.out.println("Fehler");
                h.printStackTrace();
            }
        
         if(e.getSource() == sum){
             field.setText(field.getText());
         }
         else if(e.getSource() == sub){
             field.setText(field.getText());
         }
         else if (e.getSource() == mult){
             field.setText(field.getText());
         }
         else if (e.getSource() == div){
             field.setText(field.getText());
         }
     }
};
ActionListener al2=new ActionListener(){
    public void actionPerformed(ActionEvent f){
        field.setText("");
    }
};
ActionListener al3= new ActionListener(){
    public void actionPerformed(ActionEvent g){
        if (g.getSource()==erg){
            field.setText();
        }
}

};

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Spirit528, 34

Das geht nicht.

Du kannst stattdessen jedem der beiden ActionListener ein Objekt mit einer Variablen berechnung übergeben und dann setzt die die Variable von dem Objekt objekt.setBerechnung(berechnung)

Kommentar von Dieter987 ,

Könnten Sie das bitte einmal in Codeform aufschreiben. Als Anfänger kann ich mir das schlecht vorstellen.

Kommentar von Dieter987 ,

Es wäre besser gewesen wenn ich Ihnen vorher den gesamten Code gezeigt hätte. 

Ich habe nämlich bei mir beinahe alles in die main - Methode geschrieben. siehe:http://www.paste.org/80936

Kommentar von Spirit528 ,

Ja und?

Das zwischen den beiden Zeilen mit  /* .... */ in meinem Code packst Du in die main-Methode und ersetzt damit Deine anderen 

    ActionListener al =new ActionListener(){ -Zeilen

also auch al2, al3..

Und die restlichen Sachen packst Du in die gleiche Datei aber unterhalb/außerhalb von 
public class CalcPanel { 
}

Oder in entsprechende eigene Dateien.

Kommentar von Dieter987 ,

Ich erhalte einige Fehlermeldungen:

das ist CalcPanel.java : http://www.paste.org/80938

MeinActionListener.java: http://www.paste.org/80939

MeineKlasse.java: http://www.paste.org/80940

Kommentar von Spirit528 ,

Aja.. welche Fehlermeldungen?

Kommentar von Dieter987 ,

DescriptionResourcePathLocationType
ActionListener cannot be resolved to a typeMeinActionListener.java/CalcPanel/srcline 1Java Problem
Syntax error, insert ";" to complete MethodDeclarationCalcPanel.java/CalcPanel/srcline 124Java Problem
Syntax error, insert "... VariableDeclaratorId" to complete FormalParameterListMeineKlasse.java/CalcPanel/srcline 4Java Problem
Syntax error, insert ")" to complete MethodDeclarationCalcPanel.java/CalcPanel/srcline 124Java Problem
Syntax error, insert "}" to complete ClassBodyCalcPanel.java/CalcPanel/srcline 32Java Problem
Syntax error, insert "}" to complete ClassBodyCalcPanel.java/CalcPanel/srcline 124Java Problem
Syntax error, insert "Identifier (" to complete MethodHeaderNameCalcPanel.java/CalcPanel/srcline 124Java Problem
The field MeinActionListener.meinObjekt is not visibleCalcPanel.java/CalcPanel/srcline 83Java Problem
The method setBerechnung() in the type MeineKlasse is not applicable for the arguments (String)CalcPanel.java/CalcPanel/srcline 83Java Problem
Type mismatch: cannot convert from new MeinActionListener(){} to ActionListenerCalcPanel.java/CalcPanel/srcline 74Java Problem
Type mismatch: cannot convert from new MeinActionListener(){} to ActionListenerCalcPanel.java/CalcPanel/srcline 107Java Problem

Kommentar von Spirit528 ,

In den neuen Dateien musst Du natürlich auch wieder die benötigten Klassen einbinden u.a. 

import java.awt.event.ActionListener;

In CalcPanel fehlt nach der Deklaration von 
ActionListener al3 = new MeinActionListener(meinObjekt){
und der schließenden geschweiften Klammer ein Semikolon.

ActionListener al3 = new MeinActionListener(meinObjekt){
 public void actionPerformed(ActionEvent g){
/* hier kann man dann auf this.meinObjekt aus MeinActionListener zugreifen z.b. also this.meinObjekt.setBerechnung(berechnung); oder this.meinObjekt.getBerechnung();
*/


 if (g.getSource()==erg){
  field.setText();
 };
};

Dann in MeineKlasse fehlt vor dem Methodenparameter der Datentyp

 public void setBerechnung(String berechnung) {

Das war mein Fehler..

Kommentar von Dieter987 ,

Bei mir sind nun immer noch 2 Fehler:

DescriptionResourcePathLocationType
The field MeinActionListener.meinObjekt is not visibleCalcPanel.java/CalcPanel/srcline 83Java Problem
The type MeinActionListener must implement the inherited abstract method ActionListener.actionPerformed(ActionEvent)MeinActionListener.java/CalcPanel/srcline 4Java Problem

Warnung:
The value of the field MeinActionListener.meinObjekt is not usedMeinActionListener.java/CalcPanel/srcline 5Java Problem

Kommentar von Spirit528 ,
this.meinObjekt.setBerechnung(String.valueOf(result));

ändern zu

meinObjekt.setBerechnung(String.valueOf(result));

Ich ging davon aus, dass Du das als Klassenvariable deklarieren würdest. Hier ist es in der Methode, also kommt this natürlich weg. Damit verschwindet der erste Fehler und auch das Warning.

In MeinActionListener schreibst Du noch die Methode 

   @Override
   public void actionPerformed(ActionEvent e) {
}

Das @Override darüber nicht vergessen.

Kommentar von Dieter987 ,

Vielen, vielen Dank.

Sie haben mir sehr geholfen.

Expertenantwort
von KnusperPudding, Community-Experte für Java, 10

Du kannst auf eine lokale Variable nicht von einer anderen Methode aus zugreifen.

Du kannst die Variable höchstens als Instanz-Variable deklarieren und dann von beiden Listenern drauf zugreifen.

class Test {

 String berechnung;

 ActionListener al = new ActionListener() {

   public void actionPerformed(ActionEvent e) {
        berechnung = "Hallo";
   }
}

 ActionListener a3 = new ActionListener() {
   public void actionPerformed(ActionEvent e) {
      System.out.println(berechnung);
   }
 }
}

Keine passende Antwort gefunden?

Fragen Sie die Community