# Zugriff von Klasse 2 auf Klasse 1 (die main methode hat)



## PELLE (16. Jun 2007)

Natürlich habe ich schon in die FAQ geschaut dennoch verstanden bzw. auf mein Konstrukt verstanden habe ich es nicht so dass ich das ganze anwenden konnte.

Bisher habe ich den Zugriff auf Klassen im immer so gemacht: Zugriff von Klasse1 auf Klasse2:

Klasse2.textfield.getText();


das soll ja nicht so toll sein  :wink:  weiterhin fragte ich mich immer wie kann ich aber von der Klasse2 auf die Klasse1 mit main methode zugreifen ?

Ich kann immer von Klasse1 auff alle anderen zugreifen aber nie von Klasse2,3,4,5 auf Klasse1 und deren instanzvariablen bzw. KlassenMethoden/Objektmethoden

An meinen Klassen hier könnte mir das jemand kurz erklären so dass das erklärte auch an meinem Beispiel funktioniert?

*1. Klasse mit main methode:*


```
ublic class MainWindow extends JFrame
{    static final long serialVersionUID = 1L;
     [b] boolean ladestatus;[/b]

   public MainWindow()
   {
      super("bla");      
                   
      RechnungPanel  RP = new RechnungPanel();
      SettingsPanel SP = new SettingsPanel();
      HelpPanel     HP = new HelpPanel();     
      
      JTabbedPane jtp = new JTabbedPane();     
      
      jtp.addTab("<html><font size=5>Rechung</font size></html>", RP);
      jtp.addTab("<html><font size=5>Settings</font size></html>", SP);          
      jtp.addTab("<html><font size=5>Help</font size></html>", HP); 
      
      add(jtp);
          
   }
   class RechnungPanel extends JPanel implements ActionListener
   {      
      
     private  JComboBox SourceDirectoryCB = new JComboBox();      

      public RechnungPanel(MainWindow mWindow)
      {
        setLayout(null);       

        add(SourceDirectoryCB);   
        SourceDirectoryCB.setBounds(581,107,280,25);       
        SourceDirectoryCB.setFont(new Font("Arial",Font.BOLD, 12));  
         
         SourceDirectoryCBEinlesen();      
         
         
      }  //...................................... KONSTRUKTOR ENDE ........................................ //

      public void [b]SourceDirectoryCBEinlesen()[/b]
      {
          File path = new File(SettingsPanel.sourceDirDefaultTF.getText());
          FileFilter filefilter = new FileFilter()
          {
             public boolean accept(File file)
             {
                return file.isDirectory();
             }
          };
          File[] zipfiles = path.listFiles(filefilter);
          for(int i = 0 ; i < zipfiles.length ; i++)
          {
            SourceDirectoryCB.addItem(zipfiles[i].getName());
          }
      }

      public void defaultValuesAuslesenAusDatei()
      {
          try
          {
             Properties props = new Properties();
             File ini = new File("settings.ini");
             props.load(new FileInputStream(ini));
             String volume = System.getProperty("user.dir");
             
             SettingsPanel.iniSourceDirDefault = props.getProperty("defaultVerzeichnisSource");
             
             String saved = props.getProperty("usersettingsSaved");        
             if  (saved.contains("true"))
             {           	 
                 SettingsPanel.sourceDirDefaultTF.setText(SettingsPanel.iniSourceDirDefault);
               
             }            	            
          }
          catch (Exception e)
          {
               e.printStackTrace();
          }
      }
      
      public void actionPerformed(ActionEvent e)
      {   
    
      }       
  
       
    }
     
   public static void main(String args[])
   {
      MainWindow Fenster = new MainWindow();
      Fenster.setSize(960,565);
      Fenster.setLocationRelativeTo(null);
      Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Fenster.setResizable(false);
      Fenster.setVisible(true);
    
   }
}
```


*2. Klasse bzw. 2. Karteireiter (Tab)*


```
public class SettingsPanel extends JPanel implements ActionListener
{
	static final long serialVersionUID = 1L;
	
	private JButton buttonSaveSettings;
        

    public SettingsPanel()
    {
    	

        buttonSaveSettings = new JButton("<html>[b]Save Settings[/b]</html>");
     
        setLayout(null);
     
        add(buttonSaveSettings);       
        
        buttonSaveSettings.setBounds(320, 370, 90, 35);
      
       
      
        buttonSaveSettings.addActionListener(this);   
      
    
      
    } /* -------------------------------------- Konstruktor Ende -------------------------------------*/
  

    public void actionPerformed(ActionEvent e)
    {  
                
        if(e.getSource().equals(buttonSaveSettings))
        {
           
           "MainWindow".SourceDirectoryCBEinlesen(); //funktioniert so nicht
        }        
    }

}
```


*3. Klasse bzw. 3. Karteireiter (Tab)*



```
public class HelpPanel extends JPanel implements ActionListener
{
	
	static final long serialVersionUID = 1L;
	public HelpPanel()
	
	{
		
	}
	
	
	public void actionPerformed(ActionEvent e)
    {       
       
        
    }
	
	

}
```

Fragen:

1.) Wie kann ich von Klasse 2 aus eine Methode von Klasse 1 aufrufen ? z.B. die Methode 
	
	
	
	





```
SourceDirectoryCBEinlesen();
```
 dich ich gerne aufrufen würde in der actionPerformed Methode der Klasse 2.

2. Wie kann ich von Klasse 2 aus auf die Klassenvariable  *ladestatus;* von Klasse 1 zugreifen?

Würde mich sehr über gute Antworten freuen :wink:


----------



## Wildcard (16. Jun 2007)

Komm erstmal weg von der Vorstellung das Klassen mit Klassen kommunizieren.
Das tun sie nicht. Klassen sind abstrakte Konzepte.
Eine Klasse ist eine Schablone aus der man Objekte erstellen kann.
Diese Objekte kommunizieren.
Das es nicht so einfach über den Klassennamen funktionieren kann ist klar, denn es können beliebig viele Objekte von einer Klasse erstellt werden, der Klassenname ist also nicht genug um ein Objekt eindeutig zu adressieren.
Man löst das mit Referenzen.
Will Objekt a also mit Objekt b kommunizieren, braucht Objekt a eine Referenz auf b mit der es dann b.machWas() aufrufen kann.
Auf dein Beispiel Bezogen muss dem Objekt von Klasse 2 also eine Referenz auf ein Objekt der Klasse 1 übergeben werden, damit 2 dort eine Methode aufrufen kann.


----------



## PELLE (16. Jun 2007)

Wildcard hat gesagt.:
			
		

> Auf dein Beispiel Bezogen muss dem Objekt von Klasse 2 also eine Referenz auf ein Objekt der Klasse 1 übergeben werden, damit 2 dort eine Methode aufrufen kann.



Welches Objekt von Klasse 2 meinst du denn könntest du mir das zeigen? (Vllt. hast du mir auch einen guten link am besten in deutsch wo das ganze mit Beispiel steht)

Wie übergebe ich diese Referenz auf objekt der klasse 1 ? Wie sähe denn diese Syntax aus?


----------



## Wildcard (16. Jun 2007)

PELLE hat gesagt.:
			
		

> Wie übergebe ich diese Referenz auf objekt der klasse 1 ? Wie sähe denn diese Syntax aus?


Ja, die FAQ ist wirklich fast unauffindbar gut versteckt  :roll: 
http://www.java-forum.org/de/viewtopic.php?p=87333


----------



## PELLE (16. Jun 2007)

habe dies in die 1. Klasse eingefügt:

```
private SettingsPanel sPanel;
```
 (direkt unter die klasse)

in den KOnstruktor:


```
public MainWindow(SettingsPanel sPanel)
   {
	   super("bla");
	   
	   this.sPanel = sPanel;
```


In die actionPerformed Methode:


```
sPanel.targetDirSet();
```

soweit so gut wenn da nicht das hier wäre in der main methode der klasse1:

```
MainWindow Fenster = new MainWindow(sPanel);
```


bekomme eine Fehlermeldung wegen obigem "sPanel"



> cannot make a static reference to the non static field "sPanel


"


habe nun ganz obiges : 
	
	
	
	





```
private SettingsPanel sPanel;
```
 (direkt unter die klasse)
in 
	
	
	
	





```
static SettinsPanel sPanel;
```
 umgewandelt. Nun geht es aber es gibt ja laut dem hier :

http://www.java-forum.org/de/viewtopic.php?t=50398&highlight=static+reference

auch ne lösung ohne static. Nur weiß ich noch net wie ^^ habe das hier gelesen: http://www.java-forum.org/de/viewtopic.php?t=50398&highlight=static+reference

verstehs aber net so ganz... denn obiger link beschreibt ja eher die lösung wie man in der main-methoder über eine public get/set methode auf die eigenschaften einer private instanz zugreift, das mache ich ja gar nicht.


----------



## PELLE (17. Jun 2007)

In der 2.Klasse gebe ich dies ein unterhalb der Klassendefinition. 


```
MainWindow meinW = new MainWindow();
```

Im Konstruktor dies.:


```
meinW."jetzt springt hier im Eclipse eine liste mit variablen und methoden auf"
```

Ich kann zwar in dieser Liste auf die attribute der Klasse MainWindow zugreifen, aber nicht auf die Methoden der Klassen MainWindow.

Könnte mir jemand sagen wie es auch mit den Methoden funktionieren würde ? Damit ich so drankomme:

```
meinW.SourceDirectoryCBEinlesen();
```

Habe auch die class SettingsPanel mit extends MainWindow gemacht, dennoch hatte ich kein Zugriff auf die Methoden von MainWindow. Irgendwas fehlt da noch...


----------

