# Zugriff auf Variable aus anderer Klasse



## Apon (20. Februar 2005)

Hallo!
Wie kann ich den Wert eine Variable, die innerhalb eines ActionListeners (public void actionPerformed) deklariert ist in einer anderen Klasse wieder aufrufen und verwenden?
- Hoffe, dass man die Frage verstehen und man mir helfen kann.
Danke schon mal im Voraus.


----------



## teppi (20. Februar 2005)

Guten Morgen,

da gibts verschiedene Möglichkeiten .. Also zwei Möglichkeiten wären bspw: 
_Ich nenn die beiden Klassen mal im Folgenden Klasse1 und Klasse2, ok ?  .. _

Möglichkeit 1:

Klasse1 erhält eine Klassenvariable, welche in der actionPerformed() Methode geändert wird und Klasse2 greift dann über eine getVariable() Methode auf die Variable zu ..

So ungefähr:

```
public class Klasse1 implements ActionListener
{
    private int eineVariable = 0;
    ....
    public int getVariable(){

         return this.eineVariable;
    }
    ....
    public void actionPerformed(ActionEvent e){
     
         this.eineVariable = 1; 
 
    }
}
```

Möglichkeit 2:

Einfach in der actionPerformed() Methode eine entsprechende Set Methode in der Klasse2 aufrufen. Bsp.:


```
public class Klasse1 implements ActionListener
{
    private Klasse2 andereKlasse;
    ....

    public void actionPerformed(ActionEvent e){
         
         int eineVariable = 1;
         andereKlasse.setVariable(eineVariable);
 
    }
}

public class Klasse2 
    
    int eineVariable;

   public void setVariable(int inVariable){
         
         this.eineVariable = inVariable;
 
    }
}
```


So ich hoffe das war einigermaßen verständlich .. Der Code muss natürlic noch um entsprechende Konstruktoren etc. erweitert werden .. Viell. gibts noch bessere Möglichkeiten. Das waren die zwei die mir jetzt spontan einfielen ..

Gruß Stefan


----------



## Apon (20. Februar 2005)

Hallo Stefan,
danke erstmal für deine Antwort.

Beim lesen deines Codes dachte ich: "Ja, das ist es!".
Doch nun habe ich das Problem mit der NullPointerException und innerhalb der ActionPerformed kann ich das Problem ja nicht lösen, oder doch. Die Fehlermeldung hat doch was mit (NumberFormatException) zu tun, oder nicht. Bin leider blutiger Anfänger in Sachen Java. Kann daher sein, dass dir diese Probleme "trival" vorkommen mögen - wie mein Mathe - Prof. sagen würde. 

Gruß Jens


----------



## Snape (21. Februar 2005)

Moin,
zeig doch mal den Code an der Stelle, wo es kracht.


----------



## Apon (21. Februar 2005)

Hallo!
Hier ist der Code.

Hier die Klasse, in der die Variable daklariert werden soll...


```
public class Klasse1
	extends Applet {
 
double b;
public Klasse2 Test;
 
...
 
public double Variable() {
 
	try {
	 b = Double.parseDouble(textField1.getText());
	 System.err.println("b aus Variable = " + b); // b = 44.0
	}
	catch (NumberFormatException e) {
	 b = 0;
	}
	return b;
}
 
public void button1actionPerformed(ActionEvent e) {
 
	b = Variable();
	System.err.println("b aus Variable = " + b); // b = 44.0
	Test.setVariable(b); // <---Hier kommt die NullPoitnerException
 
	Klasse2 frame = new Klasse2();
	...
}
}
```
 
Und hier noch die Klasse, in der die Variable ausgegeben werden soll...

```
public class Klasse2
	extends Frame {
double c;
public void setVariable(double inVariable) {
	 this.c = inVariable;
	 System.err.println(c);
}
public Klasse2() {
}
public void paint(Graphics g) {
	g.setColor(Color.blue);
	g.drawLine(50, 60, 50 + (int) c, 60);
	g.drawString("" + (int) c, 50, 50);
}
public void main(String[] args) {
}
}
```
 
Hoffe das reicht, um zu erkennen wo der Fehler liegt.


----------



## Snape (21. Februar 2005)

N'abend,
ganz einfacher Fehler:
Klasse 2 ist zwar in Ordnung, aber in Klasse 1 ist die Referenz auf Klasse 2 etwas unglücklich. Du fungierst erst in der Klassendeklaration mit public Klasse2 Test; aber in der actionPerformed steht dann plötzlich:


```
Test.setVariable(b);
Klasse2 frame = new Klasse2();
```

Die erste Zeile davon fliegt Dir um die Ohren, weil Test noch NULL ist. Du hast es nirgends erzeugt. Ein Objekt der Klasse 2 legst Du erst in der zweiten Zeile an, verwendest es dann aber nicht mehr. 
Also entweder instanzierst Du die Variable Test vorher und kannst dann die frame-Variable weg lassen, oder Du lässt den Code mit Test weg und arbeitest mit frame.

1. sähe ungefähr so aus:
public Klasse2 Test = new Klasse2();
// dies und das
//in der actionPerformed dann:
Test.setVariable(b);
Test.show(); // oder Test.setVisible(true); -- musst halt schauen
// Klasse2 frame = new Klasse2(); <-- das kann dann weg

2. sähe so aus:
// public Klasse2 Test; <-- nicht mehr nötig
//in der actionPerformed dann:
// Test.setVariable(b);  <-- nicht mehr nötig
Klasse2 frame = new Klasse2();
frame.setVariable(b);
frame.show(); // oder frame.setVisible(true), s.o.

Im übrigen: Nur Klassennamen und Konstanten sollten mit einem Großbuchstaben beginnen - wobei Konstanten dann durchgehend in Großbuchstaben zu schreiben sind.


----------



## Apon (21. Februar 2005)

Hallo!

Hab' wohl doch noch was vergessen. Ich glaube folgender Code wird zur Fehlersuche auch noch benötigt. 
Denn die NullPoiterException verweißt hier noch auf die Zeile 08. 


```
01 class Satz_button1_actionAdapter
02	implements java.awt.event.ActionListener {
03 Klasse1 adaptee;
04 Satz_button1_actionAdapter(Klasse1 adaptee) throws IOException {
05	this.adaptee = adaptee;
06 }
07 public void actionPerformed(ActionEvent e) {
08	adaptee.button1actionPerformed(e);
09 }
10 }
```
 
Des weiteren werden folgende Verweise noch aufgelistet:

```
java.lang.NullPointerException
at wertübergabe.Klasse1.button1actionPerformed(Klasse1.java:89)
at wertübergabe.Satz_button1_actionAdapter.actionPerformed(Klasse1.java:8)
at java.awt.Button.processActionEvent(Button.java:382)
at java.awt.Button.processEvent(Button.java:350)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
```
 
Bedanke mich schon mal im Voraus für eure Hilfe.

Gruß Jens


----------



## Snape (21. Februar 2005)

Hast Du das schon so ausprobiert, wie ich es eben beschrieben habe?


----------



## Apon (21. Februar 2005)

Hat sich grad überschnitten. Bin noch dabei es auszuprobieren. Danke schon mal.
Scheinen tüpische Anfängerfehler zu sein, oder? Na ja, bin ja nicht umsonst 'n Grünschnabel.

Gruß Jens


----------



## Apon (21. Februar 2005)

Perfekt!

Es funktioniert.

Danke Snape. Wäre ja fast verzeifelt.

Gruß Jens


----------



## Snape (21. Februar 2005)

Naja, das war noch ziemlich einfach...
Aber anfangs tun sich viele schwer mit dem Zugriff auf Objekte anderer Klassen. Dabei sieht man m.E. besonders gut, woran es vielen Büchern mangelt...


----------

