# aus Klasse auf Objektvariable einer anderen Klasse zugreifen



## Guest (29. Jan 2005)

Hallo Leute,
ich habe ein kleines Problem...

Ich erzeuge in meiner Hauptklasse eine Instanz einer anderen Klasse...


```
public class GUI  extends JFrame
{
    public static Buchregal Regal;

     ....

     ....

        public static void main(String[] args)
	{
		Regal = new Buchregal();
	}
}
```

und möchte jetzt aus einer anderen Klasse auf eine Methode der Klasse Buchregal zugreifen...


```
public class Add_book
{
      ....

      ....

      Regal.add_buch(txtBuch.getText(),txtAutor.getText(),txtVerlag.getText());

      .... 

      ....
}
```

Aber irgendwie geht das nicht! Der Fehler wird unter eclipse als "Regal cannot be reslveld" angezeigt...

Kann mir jemand sagen was ich falsch mache?

Gruß, Michael


----------



## Heiland (29. Jan 2005)

Du brauchst erst mal eine neue Instanz dieser Klasse!

erst mal 

Buchregal Regal;

und dann noch den Konstruktor aufrufen

mit

Regal = new Buchregal(parameter)

und danach kannst du das Objekt Regal benutzen mit allen Methden die in Buchregal definiert sind!


----------



## Gast (29. Jan 2005)

Danke für die schnelle Antwort aber ich habe es leider noch nicht richtig verstanden...

Ich habe aber doch in der Klasse GUI schon eine instanz erzeugt...
Muss ich um aus GUI und aus Add_book auf Regal zugreifen zu können in beiden eine Instanz von Buchregal erzeugen?


----------



## Heiland (29. Jan 2005)

Hmmm, weiß jetzt nicht genau was du meinst! Kannst du mal den gesamten code posten, dann kann ich dir das vielleicht machen...


----------



## mic_checker (29. Jan 2005)

Es müsste funzen wenn du in GUI die Methode aufrufen willst, wenn du in einer ganz anderen Klasse darauf zugreifen willst musst du da ne Instanz erzeugen.

Poste notfalls mal deinen Code.


----------



## Guest (29. Jan 2005)

ok, hoffe das ist verständlich....


```
package Buchregal;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GUI  extends JFrame
{
    public static Buchregal Regal;
	private static GUI Oberflaeche;
	private static Add_book GUI_add;
	private JPanel panLabels;
	private JButton butVor, butZurueck, butSichern, butAdd;
	private JLabel labAutor, labBuch, labVerlag;
	private JTextField txtBuch, txtAutor, txtVerlag;

	GUI()
	{
		super("Buchregal");
		
	    setLocation(50,50);
	        
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    
	    // Panel für Laels erzeugen und Layout zuweisen
	    panLabels = new JPanel();
	    panLabels.setLayout(new BorderLayout());
	    
	    // Buttons erzeugen
	    butVor = new JButton(">>");
	    butZurueck = new JButton("<<");
	    butAdd = new JButton("Buch hinzufügen");
	    
	    // Labels erzeugen
	    labBuch = new JLabel("Buch:");
	    labAutor = new JLabel("Autor:");
	    labVerlag = new JLabel("Verlag:");
	   
	    // Labels Zentrieren
	    labBuch.setHorizontalAlignment(JLabel.CENTER);
	    labAutor.setHorizontalAlignment(JLabel.CENTER);
	    labVerlag.setHorizontalAlignment(JLabel.CENTER);
	    
	    // Labels auf Panel zusammenfassen
	    panLabels.add(BorderLayout.SOUTH, labBuch);
	    panLabels.add(BorderLayout.CENTER, labAutor);
	    panLabels.add(BorderLayout.NORTH, labVerlag);
	    
	    // auf Oberfläche die einzelnen Komponenten zusammenfassen
	    add(BorderLayout.WEST, butZurueck);
	    add(BorderLayout.CENTER, panLabels);
	    add(BorderLayout.EAST, butVor);
	    add(BorderLayout.SOUTH, butAdd);
	       	   
	    setSize(500,145);	 // größe der JFrame
	   	setResizable(false); // Man kann die größe Manuell nicht verändern
	
	   	setVisible(true);
	
		
		butAdd.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				GUI_add.setVisible(true);
			}
		});
		
	}
	
	public static void main(String[] args)
	{
		Regal = new Buchregal();
	    Oberflaeche = new GUI();
		GUI_add = new Add_book();
	}
	
}

// Ist noch nicht komplett! Es muss noch eingabaut werden das von der GUI aus durch die Liste gelaufen werden kann
// Daher muss auf jeden fall auch hier die Objektvariable Regal verfügbar sein
```


```
package Buchregal;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Add_book extends JFrame
{
	// private static GUI Oberflaeche;
	private JPanel panTextfields;
	private JButton butEinfuegen;
	private JTextField txtBuch, txtAutor, txtVerlag;
	private JLabel labAutor, labBuch, labVerlag;	

	Add_book()
	{
		super("ein Buch hinzufügen");
		
	    setLocation(70,200);
	        
	    setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
	    
	    // Panel für Laels erzeugen und Layout zuweisen
	    panTextfields = new JPanel();
	    panTextfields.setLayout(new FlowLayout(FlowLayout.LEFT));
	    
	    // Button erzeugen
	    butEinfuegen = new JButton("Hinzufügen");
	    
	    // Textfelder erzeugen
	    txtBuch = new JTextField("",20);
	    txtAutor = new JTextField("",20);
	    txtVerlag = new JTextField("",20);
	    
	    // Labels erzeugen
	    labBuch = new JLabel("Buch:   ");
	    labAutor = new JLabel("Autor:   ");
	    labVerlag = new JLabel("Verlag: ");
	    
	    // Labels  und txts auf Panel zusammenfassen
	    panTextfields.add(BorderLayout.SOUTH, labBuch);
	    panTextfields.add(BorderLayout.SOUTH, txtBuch);
	    panTextfields.add(BorderLayout.CENTER, labAutor);
	    panTextfields.add(BorderLayout.CENTER, txtAutor);
	    panTextfields.add(BorderLayout.NORTH, labVerlag);
	    panTextfields.add(BorderLayout.NORTH, txtVerlag);
	    
	    // auf Oberfläche die einzelnen Komponenten zusammenfassen
	    add(BorderLayout.WEST, butEinfuegen);
	    add(BorderLayout.CENTER, panTextfields);
	       	   
	    setSize(400,110);	 // größe der JFrame
	   	setResizable(false); // Man kann die größe Manuell nicht verändern
	
	   	butEinfuegen.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				Regal.add_buch(txtBuch.getText(),txtAutor.getText(),txtVerlag.getText());
                                // Über diese GUI sollen bücher ins Buchregal hinzugefügt werden
			}
		});
	}
}
```


```
package Buchregal;

import java.io.*;
import java.util.*;

public class Buchregal extends LinkedList implements Serializable
{
    void add_buch(String t, String a, String v)
    {
       addLast(new Buch(t,a,v));
    }   
}

class Buch implements Serializable
{
    private String titel, autor, verlag;
    
    Buch(String t, String a, String v)
    {
         titel = t;
         autor = a;
         verlag = v;
    }
}
```

Vielen dank schon mal das Du Dir das ansiehst!


----------



## Heiland (29. Jan 2005)

kein Problem, mach ich gerne, aber ich muss nebenbei auch noch mein Proggi machen.... ;-)


----------



## mic_checker (29. Jan 2005)

```
public static void main(String[] args)
   {
      Regal = new Buchregal();
       Oberflaeche = new GUI();
      GUI_add = new Add_book();
   }
```

1) Es gibt keine Klasse Regal oder sollte das der Name für ein Objekt vom Typ Buchregal sein ?

2) In Add_book kannst ne Variable vom Typ Buchregal deklarieren und initialisieren:


```
Buchregal r = new Buchregal();
```

In Add_book:


```
public void actionPerformed(ActionEvent e)
         {
            r.add_buch(txtBuch.getText(),txtAutor.getText(),txtVerlag.getText());
                                // Über diese GUI sollen bücher ins Buchregal hinzugefügt werden
         }
```

so müsste es klappen, ist aber nur auf die schnelle gemacht, nicht wundern wenn es nicht funzt.


----------



## Guest (29. Jan 2005)

> 1) Es gibt keine Klasse Regal oder sollte das der Name für ein Objekt vom Typ Buchregal sein ?



Das soll in der Tat eine Objektvariable vom Typ Buchregal sein (wird im oberen Teil der Klasse deklariert)

Wenn ich den Rest so mache wie Du es beschrieben hast, dann greife ich aber doch aus der Klasse GUI auf eine Instanz von Buchregal zu und von Add-book auf eine ganz andere Instanz. Ich müsste es aber hinbekommen von beiden die gleiche Instanz ansprechen zu können... Ist das überhaupt möglich?


----------



## mic_checker (29. Jan 2005)

Wieso willst du überhaupt von beiden Klassen auf die gleiche Instanz zugreifen? 

Du könntest evtl. ne Methode schreiben, so dass die eine Klasse der andern Klasse das Objekt übergibt.


----------



## Guest (29. Jan 2005)

Die eine Klasse ist ein GUI mit dem ich durch eine Liste zappen können will um mir die einzelnen Elemente anzeigen zu können, mit der anderen GUI Klasse möchte ich in die gleiche Liste Elemente hinzufügen...
Zusätzlich soll es möglich sein die Liste zu serialisieren.

Ist das nicht einfach durch eine bestimmte deklaration der Objektvariable der Liste möglich das ich von überall darauf zugreifen kann?


----------



## mic_checker (29. Jan 2005)

Wenn in GUI steht:


```
public static Buchregal r = new Buchregal();
```

kannst in Add_book drauf zugreifen:


```
GUI.r.add_buch..
```

müsste eigentlich so gehen...


----------



## Gast (30. Jan 2005)

Ich habe mein Problem nun mit einer Übergabefunktion gelöst welche die nötige Objektvariable von einem GUI an das nächste übergibt...

Vielen Dank für Eure hilfe!

Gruß, Michi


----------

