# auf Variablen von Methoden einer anderen Klasse zugreifen



## Coder0815 (13. Jan 2005)

hallo allerseits!

wie kann ich aus einer private methode in klasse A auf eine variable in einer public methode in klasse B zugreifen?

geht das in etwa so?



```
private void progressPropertyChange(java.beans.PropertyChangeEvent evt) {
  player.progress(microseconds);
     
    }
```


die entsprechende methode in der klasse B lautet:


```
public void  progress(int bytesread, long microseconds, byte[] pcmdata, Map properties)
	{
		
		display("progress : "+properties.toString());
            
	}
```


beim compilieren bekomme ich immer die fehlermeldung das er die variable "microseconds" nicht kennt.


----------



## dotlens (13. Jan 2005)

in Klasse B hast du ja nicht einmal eine variable microseconds, jedenfalls nicht in dem Teil den du geposted hast. 
du erwartest lediglich eine long var und gibst ihr den namen microsendoncs. das nennt man parameter....


----------



## foobar (13. Jan 2005)

> wie kann ich aus einer private methode in klasse A auf eine variable in einer public methode in klasse B zugreifen?


Das geht nicht. Du kannst lediglich auf Member anderer Klassen zugreifen, sofern der Modifier das zulässt.


----------



## Snape (13. Jan 2005)

Außerdem erwartet die Methode progress(...) 4 Parameter und Du übergibst nur einen, dazu noch an der falschen Stelle.


----------



## Coder0815 (14. Jan 2005)

ok. Hab mal wieder was dazugelernt  :wink: 

Dann probiere ich es mal anders.
Es geht um die Variable 
	
	
	
	





```
sek
```
 die in Klasse A folgender Methode steht:


```
public  void  progress(int bytesread, long microseconds, byte[] pcmdata, Map properties)
	{
           
            int sek = (int) (microseconds/1000);       
            display("progress : "+properties.toString());       
             
        }
```


Auf diese Variable möchte ich nun in Klasse B aus folgender Methode zugreifen:



```
private void  seek (){
            
            // Hier soll der Wert der Variable sek aus obiger Methode an den JSlider Wert übergeben werden
            progress.setValue(sek);   //progress ist ein JSlider der pro Sekunde einen Tick weitergehen soll. P.S.: Hier passiert natürlich jetzt noch nix ;-)
            
             
	}
```


Geht das?


----------



## Snape (15. Jan 2005)

Moin,
klare Antwort: nein.

Begründung:
1. Die Variable sek ist nur innerhalb der Methode progress(...) sichtbar, weil sie dort deklariert wird.
2. Woher soll die Variable denn kommen in
progress.setValue(sek);
wenn diese Zeile in einer Methode einer anderen Klasse ausgeführt wird, in der die Variable sek nicht im geringsten bekannt ist?

Lösungsansatz:
Die Sichtbarkeit muss von methodenweit auf instanzweit ausgedehnt werden. Dazu gibt es eine dreckige und eine saubere Lösung:
a) sek wird als public int in der Klasse A deklariert und wird damit zur Instanzvariable - jede Instanz dieser Klasse verfügt dann über die Eigenschaft sek (dreckig weil nicht sauber OO und keine Kapselung)
b) sek wird als private int in der Klasse A deklariert und eine zugehörige public getter-Methode liefert den Inhalt

```
class A
{
 private int sek = 0;

 public int getSekValue()
 {
   return sek;
 }
}
```

(saubere Lösung, OO und gekapselt)

Dann musst Du nur noch in Klasse B die Zeile anpassen in so etwas:
progress.setValue(referenceToClassA.getSekValue());

Für die dreckige Lösung sähe die Zeile so aus:
progress.setValue(referenceToClassA.sek);


----------



## Coder0815 (17. Jan 2005)

Danke soweit schon mal! Aber leider funktioniert das ganze nicht so wie ich mir das vorstelle.

Ich versuche jetzt ein MP3-File einzulesen und den JSlider pro x kB nach vorne zu bewegen. Dazu hab ich folgendes geschrieben:


```
private void progr() {
int dateigroesse;
       
         
try { 
                           
  int filesize = (int) fileName.length();    // Dateigröße ermitteln 
  byte[] data = new byte[filesize];   // Genügend großes Array erzeugen 
  // Einen Stream erzeugen, mit dem die Datei gelesen wird 
  DataInputStream in = new DataInputStream(new FileInputStream(fileName)); 
  in.readFully(data);  // Dateiinhalt in das Array einlesen 
  in.close(); 
  dateigroesse= filesize/1024;
  progress.setMaximum(dateigroesse);
  progress.setValue(dateigroesse);
  
  for (int i=0; i<=dateigroesse; i+=1024){
    
      progress.setValue(i);
 }
} 
  catch (IOException e) { e.printStackTrace();}

 
    }
```

Der JSlider bewegt sich aber keinen Millimeter.  Wat mach ich nu falsch???
 :bahnhof:


----------



## Coder0815 (17. Jan 2005)

Vielleicht sollte ich noch erwähnen das fileName die Variable in folgender Methode ist , die die Datei öffnet:


```
private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
        FileDialog fileDialog = new FileDialog(this, "Open...", FileDialog.LOAD);
        fileDialog.show();
        if (fileDialog.getFile() == null)
            return;
        fileName = fileDialog.getDirectory() + File.separator + fileDialog.getFile();
        player.oeffnen(fileName);
        anzeige.setText(fileName);
        fileStatus=true;
       
    }
```


----------

