# Objekt übergeben ???



## swyn (6. Jun 2009)

Hallo alle zusammen,

ich hab folgendes Problem.
Ich würde gerne in einer anderen Klasse das Objekt 
'PetriEdiSim programmInhalt' aufrufen.
Dummerweise komm ich nur mit folgendem Code dahin


```
ExternalFrame.externalFrame.getProgrammInhalt();
```

Das ist nicht sehr schön, und ich weis, es müsste da eine andere Möglichkeit geben
wie ich das Objekt 'ExternalFrame externalFrame' nicht static setzen muss.

Wäre cool, wenn mir da jemand weiterhelfen könnt.

Vielen Dank schon im vorraus

Gruß

Hier noch der Java Code.




```
public class ExternalFrame extends JFrame
{

	public static ExternalFrame externalFrame = null;

	private PetriEdiSim programmInhalt = null;
	private JPanel panel = null;
	
	public static void main(String argv[])
	{
		externalFrame = new ExternalFrame();
	}
	

	public ExternalFrame()
	{
		
		super("Editor und Simulator fuer Petri-Netze | Version 2");  
		javax.swing.JPopupMenu.setDefaultLightWeightPopupEnabled(false);
		// Programmleistenüberschrift
				
		programmInhalt = new PetriEdiSim();

		
		panel = new JPanel();
		panel.setBackground(Color.lightGray);
		panel.add(programmInhalt);
		this.add(panel);
		
		programmInhalt.init();
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setPreferredSize(new Dimension(900,630));
		this.setVisible(true);
		this.menuLeisteErstellen();
		this.pack();
	}

	public PetriEdiSim getProgrammInhalt()
	{
		return programmInhalt;
	}


}
```


----------



## SlaterB (6. Jun 2009)

wenn das andere Objekt programmInhalt ist,
dann kannst du
programmInhalt = new PetriEdiSim(this);
ausführen,
programmInhalt bekommt so eine Referenz auf das ExternalFrame-Objekt,
Konstruktor natürlich entsprechend anpassen

oder etwas später
programmInhalt.init(this);


----------



## swyn (6. Jun 2009)

Hmm Danke, nur ich stell mich irgendwie etwas blöd an.
Vielleicht könnte mir das jemand an der richtigen Stelle mal zeigen.
Ich soll nämlich ein schon bestehendes Programm umschreiben.
Und die Klasse PetriEdiSim ist nicht von mir.

Problem ist, dass da auch kein Konstruktor da ist.

Ich habs damit probiert:


```
public PetriEdiSim(ExternalFrame externalFrame)
{
    [COLOR="Red"]???[/COLOR]
}
```

Hier mal mehr oder weniger den ganzen Inhalt von den Klassen



```
public class PetriEdiSim extends Applet 
{

  public PetriBedien   Bedienfeld;        
  public PetriZeichnen Zeichenfeld;
   
  private HinweisPanel  MaxAnzeige1;
  private HinweisPanel  MaxAnzeige2;
  private HinweisPanel  MaxAnzeige3;
  private HinweisPanel  MaxAnzeige4;
  private HinweisPanel  MaxAnzeige5;  
  private HinweisPanel  FehlerAnzeige1;
  private HinweisPanel  FehlerAnzeige2;
  private HinweisPanel  FehlerAnzeige3;
  private HinweisPanel  FehlerAnzeige4;
  private HinweisPanel  PlatzTransAnzeige;
  private TextPanel     TextEingabe;
  private TransPanel    TransEingabe;
  
  private HinweisNeuPanel  neuAnzeige;  //-- FH Ansbach
  private SpeicherPanel speicherAnzeige; //-- FH Ansbach

  
  private final int ZEICHENRAND   = 0;   // Randbreite um das
                                         // Zeichenfeld
  private final int ZFBREITE      = 700; // Breite des Zeichenfeldes


  private int selectedPlatz    = -1;     // Platz wurde angeklickt
  private int selectedTrans    = -1;     // Transition wurde angeklickt
  private int selectedKante    = -1;     // Kante soll geloescht werden
  private int selectedText     = -1;     // Text wurde angeklickt       
  private int anzToken         = 0;      // Anzahl der Token auf einem Platz
  private boolean movePlatz    = false;  // Bewegen von Plaetzen
  private boolean moveTrans    = false;  // Bewegen von Transitionen
  private boolean moveText     = false;  // Bewegen von Texten      
  private boolean ziehkante    = false;  // Ziehen von Kanten   
  private int knoten_von       = 0;      // Kante von Platz oder Trans
  private int knoten_nach      = 0;      // Kante von Platz oder Trans
  private int kante_von        = -1;     // Platz- oder Trans-Nr. der Kante
  private int kante_nach       = -1;     // Platz- oder Trans-Nr. der Kante
  private int startx_ziehKante = 0;      // Anfang beim Kanteziehen x-Wert
  private int starty_ziehKante = 0;      // Anfang beim Kanteziehen y-Wert
  private int endx_ziehKante   = 0;      // Ende beim Kanteziehen x-Wert
  private int endy_ziehKante   = 0;      // Ende beim Kanteziehen y-Wert
  public  String text;                   // Einzulesender Text aus dem Textfeld

  private  int TR_H  = 0;
  private  int TR_B  = 0;
  private  int PL_R  = 0;

  
  /* Setzen des Layouts fuer den gesamten Editor */

  public FlowLayout flow = new FlowLayout(0, 0, FlowLayout.LEFT);
  
  /***************************************************************/
  /** Diese Methode initialisiert das komplette Applet und setzt */
  /** die benoetigten Variablen.                                 */


  public void init()
  {

	File file = new File("");
	  

	String AppletURL = file.getAbsolutePath() + "\\";
	

    setBackground(Color.lightGray);
    setLayout(flow);


    Bedienfeld              = new PetriBedien(AppletURL);
    add(Bedienfeld);
      
    
    int Bedienfeldhoehe     = 574; // Höhe der Weißen Zeichenplatte
    //  int Bedienfeldhoehe     = Bedienfeld.preferredSize().height;
    int Bedienfeldbreite    = Bedienfeld.preferredSize().width;
    // showStatus(Bedienfeldhoehe + "  " + Bedienfeldbreite);
    
    Zeichenfeld = new PetriZeichnen(new Dimension(ZFBREITE, Bedienfeldhoehe));
    Zeichenfeld.setBackground(Color.white);

//	-- Hier start FH AN
	this.TR_H  = Zeichenfeld.TRANSHOEHE; 
	this.TR_B  = Zeichenfeld.TRANSBREITE;
	this.PL_R  = Zeichenfeld.PLATZRADIUS;
//	-- Hier ende FH AN 

    MaxAnzeige1 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				   Bedienfeldhoehe, ZFBREITE,
				   "Maximale Anzahl von ",
				   "Plätzen erreicht !", "");
    MaxAnzeige2 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				   Bedienfeldhoehe, ZFBREITE,
				   "Maximale Anzahl von ",
				   "Transitionen erreicht !", "");
    MaxAnzeige3 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				   Bedienfeldhoehe, ZFBREITE,
				   "Maximale Anzahl von Token",
				   "pro Platz erreicht !", "");
    MaxAnzeige4 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				   Bedienfeldhoehe, ZFBREITE,
				   "Maximale Anzahl von ",
				   "Textbausteinen erreicht !", "");
    MaxAnzeige5 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				   Bedienfeldhoehe, ZFBREITE,
				   "Maximale Anzahl von ",
				   "Kanten erreicht !", "");
    FehlerAnzeige1 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				      Bedienfeldhoehe, ZFBREITE,
				      "Transition kann nicht schalten !",
				      "Keine Plätze im Vorbereich",
				      "dieser Transition !");
    FehlerAnzeige2 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				      Bedienfeldhoehe, ZFBREITE,
				      "Transition kann nicht schalten !",
				      "Keine Plätze im Nachbereich",
				      "dieser Transition !");
    FehlerAnzeige3 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				      Bedienfeldhoehe, ZFBREITE,
				      "Transition kann nicht schalten !",
				      "In einigen Plätzen im Vorbereich",
				      "befinden sich keine Token !");
    FehlerAnzeige4 = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
				      Bedienfeldhoehe, ZFBREITE,
				      "Maximale Anzahl von Token in",
				      "einem Platz im Nachbereich erreicht !","");
    PlatzTransAnzeige = new HinweisPanel(Zeichenfeld, Bedienfeldbreite,
					 Bedienfeldhoehe, ZFBREITE,
					 "Es sind nur Kanten zwischen einem",
					 "Platz und einer Transition erlaubt",
					 "sowie umgekehrt !");
    TextEingabe  = new TextPanel(Zeichenfeld, Bedienfeldbreite,
			         Bedienfeldhoehe, ZFBREITE);

    TransEingabe = new TransPanel(Zeichenfeld, Bedienfeldbreite,
				  Bedienfeldhoehe, ZFBREITE);
    
//  -- Hier start Fh Ansbach
    neuAnzeige = new HinweisNeuPanel(Zeichenfeld, Bedienfeldbreite,
			   Bedienfeldhoehe, ZFBREITE,
			   "Soll das alte Petrinetz gespeichert werden?", "");
    
    speicherAnzeige = new SpeicherPanel(Zeichenfeld, Bedienfeldbreite,
    			Bedienfeldhoehe, ZFBREITE,
    			"Speichern. Verzeichnis und Dateiname angeben.");
// 	-- Hier ende Fh Ansbach


    add(MaxAnzeige1);
    add(MaxAnzeige2);
    add(MaxAnzeige3);
    add(MaxAnzeige4);
    add(MaxAnzeige5);
    add(FehlerAnzeige1);
    add(FehlerAnzeige2);
    add(FehlerAnzeige3);
    add(FehlerAnzeige4);
    add(PlatzTransAnzeige);
    add(TextEingabe);
    add(TransEingabe);
    
    add(neuAnzeige);		// -- Fh Ansbach
    add(speicherAnzeige);	// -- Fh Ansbach

    add(Zeichenfeld);


    //    resize( Bedienfeldbreite + ZFBREITE, Bedienfeldhoehe);
    //    resize(900, 580);
    
    repaint();
   
  }
  

  /***************************************************************/
  /** Diese Methode wird benoetigt um einige Variablen korrekt   */
  /** zu setzen.                                                 */

  public void start(){
    repaint();
  }


  /***************************************************************/
  /** Diese Methode wird aufgerufen, wenn das Applet vom System  */
  /** zurueckgegeben wird                                        */

  public void destroy(){
    System.gc();
    System.exit(0);
  }

 
  /*****************************************************************/
  /** Diese Methode ist fuer die Bearbeitung der Benutzer-Eingaben */
  /** zustaendig.                                                  */

      public boolean handleEvent(Event evt)
      {
            ...
      }
  /*****************************************************************/
  /** Diese Methode zeichnet bei Bedarf den gesamten Editor und    */
  /** Simulator neu                                                */

  public void paint(Graphics graphic){
    
    resize(890, 580);
  }

  
  public PetriZeichnen getZeichenfeld()
  {
	  return this.Zeichenfeld;
  }
  
  public HinweisNeuPanel getNeuAnzeige()
  {
	  return this.neuAnzeige;
  }
  
  public SpeicherPanel getSpeicherAnzeige()
  {
	  return this.speicherAnzeige;
  }

  
}  /* Ende Klasse PetriEdiSim */
```

Und hier soll dann das Objekt 'PetriEdiSim programmInhalt' aufgerufen werden.
(habs rot eingefärbt damit ihr nicht soviel suchen müsst  )


```
class HinweisNeuPanel extends Panel{
	
  public Button JaButton;
  public Button NeinButton;
  public Button AbbrechenButton;
  public Canvas zeichenfeld;
  private int bedienbreite;
  private int bedienhoehe;
  private int zfbreite;
  
  private int buttonstatus = 0;

  /* Setzen des Layouts fuer dieses Panel */

  public GridBagLayout gridbag            = new GridBagLayout();
  public GridBagConstraints gridbagconstr = new GridBagConstraints();

  /***************************************************************/
  /*** Konstruktor ***/

  public HinweisNeuPanel(Canvas zeichenfeld, int bedienbreite,
		      int bedienhoehe, int zfbreite, String AnzeigeText1,
		      String AnzeigeText2) {
    
    this.zeichenfeld   = zeichenfeld;
    this.bedienbreite  = bedienbreite;
    this.bedienhoehe   = bedienhoehe;
    this.zfbreite      = zfbreite;

    setBackground(Color.lightGray);
    setLayout(gridbag);
    setFont( new Font("Helvetica", Font.PLAIN, 14));

    gridbagconstr.gridwidth   = GridBagConstraints.REMAINDER;
    gridbagconstr.anchor      = GridBagConstraints.CENTER;
    Label AnzeigeLabel1       = new Label(AnzeigeText1, Label.CENTER);
    gridbag.setConstraints(AnzeigeLabel1, gridbagconstr);
    add(AnzeigeLabel1);

    Label AnzeigeLabel2       = new Label(AnzeigeText2, Label.CENTER);
    gridbag.setConstraints(AnzeigeLabel2, gridbagconstr);
    add(AnzeigeLabel2);


    JaButton                = new Button("Ja");
    JaButton.setBackground(Color.white);
    gridbag.setConstraints(JaButton, gridbagconstr);
    add(JaButton);
    NeinButton                = new Button("Nein");
    NeinButton.setBackground(Color.white);
    gridbag.setConstraints(NeinButton, gridbagconstr);
    add(NeinButton);
    AbbrechenButton                = new Button("Abbrechen");
    AbbrechenButton.setBackground(Color.white);
    gridbag.setConstraints(AbbrechenButton, gridbagconstr);
    add(AbbrechenButton);

    resize(300, 150);
    move((bedienbreite + zfbreite/2)-150, bedienhoehe/2-75);
    hide();

  }

  
  /***************************************************************/
  /*** Diese Methode reagiert auf den OkayButton und laesst den  */
  /*** Hinweis wieder verschwinden                               */

  public boolean action(Event evt, Object obj)
  {
	
    if (evt.target == JaButton)
    {
    	
    	[COLOR="Red"]ExternalFrame.externalFrame.getProgrammInhalt().getZeichenfeld().zeichneBsp(0);[/COLOR]
      hide();
    }
    else if(evt.target == AbbrechenButton)
    {
    	// Hier soll nichts passieren
        hide();
    }
    else if(evt.target == NeinButton)
    {
    	           
[COLOR="Red"]ExternalFrame.externalFrame.getProgrammInhalt().getZeichenfeld().zeichneBsp(0);[/COLOR]
        hide();
    }
    return false;
  }
```

Danke für die Hilfe 

gruß

P.s.: Ich hoffe ich bin mit dem Anliegen noch im richtigen Tread. Weil Hausaufgaben wäre etz vllt auch angepasst :-(


----------



## SlaterB (6. Jun 2009)

schau dir 
Canvas zeichenfeld;
an, das wird in HinweisNeuPanel auch im Konstruktor übergeben, dann in einem Klassenattribut gespeichert und ist in allen Methoden verfügbar,
so musst du es auch mit ExternalFrame machen,
nur dass du es gleich zweimal durchreichen musst:
von ExternalFrame an PetriEdiSim und von PetriEdiSim an alle HinweisNeuPanel

PetriEdiSim ist ein Applet, das hat zwar in einem JFrame gar nix zu suchen, generell sollte man da aber den Konstruktor nicht verändern
(falls mal richtigerweise ein Web-Browser das Applet darstellen soll, wüßte der nicht, wie er den Konstruktor aufrufen müsste)

also lieber ExternalFrame in der init-Methode mitgeben und dort an die HinweisNeuPanel-Konstruktoren weiterleiten

---------

andererseits brauchst du in HinweisNeuPanel gar nicht das JFrame!
für Aufrufe
> ExternalFrame.externalFrame.getProgrammInhalt().getZeichenfeld()
würde es auch reichen, wenn PetriEdiSim sich selber an HinweisNeuPanel übergeben würde, dann wäre der Aufruf
programmInhalt.getZeichenfeld()

oder aber, es wird das Canvas zeichenfeld übergeben, was jetzt ja auch schon passiert!
zeichenfeld ist verfügbar, also schreibe einfach 
zeichenfeld.zeichneBsp(0)
und fertig, die anderen Objekte musst du gar nicht kennen

-----

Methoden und Variablen unbedingt klein schreiben!


----------



## swyn (6. Jun 2009)

jep, danke hat hingehaut.
vielen dank 

bei den großgeschriebenen methoden und variablen trifft mcih keien schuld. den hat hat meine vorhängering so gemacht.
find ich auch etwas störend, aber bin zu faul da alles umzuschreiben.

aber vielen herzlichen dank für die hilfe.


gruß


----------

