# Instanzen erzeugen und vernichten



## klein-odd (21. Mai 2007)

Hallo !

Klasse MAIN besteht aus einem Fenster und  zwei Knöpfe "mehr" und "weniger".

```
...

JButton mehr = new JButton("mehr");
mehr.addActionListener(this);
JButton weniger = new JButton("weniger");
weniger.addActionListener(this);
...
```

Beim Drücken auf "mehr" wird eine Instanz von NEBEN  erzeugt: 


```
public void actionPerformed(ActionEvent e)
{
    String cmd = e.getActionCommand();
    if(cmd.equals("mehr"))
        {
            NEBEN neben = new NEBEN();
        }
}
```

es erscheint ein Fenster mit einer Nummer im Titel nach folgendem code :


```
public class NEBEN
{
    public NEBEN()
    {
        JFrame window = new JFrame();
        window.setTitle(window.getName());
    }
}
```

ich brauche mit dem knopf "weniger" die  angezeigten Fenster non NEBEN zu stückweise zu löschen,
wie kann ich den Listener erweitern ?


```
public void actionPerformed(ActionEvent e)
{
    String cmd = e.getActionCommand();
    if(cmd.equals("mehr"))
        {
            NEBEN neben = new NEBEN();
        }

    if(cmd.equals("weniger"))
        {
            ???????????????????
        }
}
```
[/code]


----------



## SlaterB (21. Mai 2007)

du musst dir die Neben-Objekte in einer Liste oder Array als Exemplarvariable speichern, 
dann kannst du auch später daruf zugreifen und dispose() oder sonstwas aufrufen,

Tipp: versuche das ganze erstmal mit EINEM Fenster in einer einfachen Variable


----------



## ARadauer (22. Mai 2007)

ja genau


```
....
Vector<NEBEN> nebenVector = new Vector<NEBEN>();


....

public void actionPerformed(ActionEvent e) 
{ 
    String cmd = e.getActionCommand(); 
    if(cmd.equals("mehr")) 
        { 
            NEBEN neben = new NEBEN(); 
            nebenVector.add(neben);
        } 

    if(cmd.equals("weniger")) 
        { 
            Neben temp = nebenVector.get(nebenVector.size());
            temp.setVisible(false);
            nebenVector.remove(nebenVector.size());
        } 
}
```


so ungefähr


----------



## klein-odd (29. Mai 2007)

Danke Euch beiden,

der Einfall mit dem Vektor hat das Gute an sich,
dass man die Elemente am Anfang oder am Ende 
des Vektors direkt ansprchen kann und so kann man
die Objekte löschen, die zuletzt oder zuerst erstellt wurden.


```
NEBEN neb = (NEBEN) vector.firstElement();
neb.dispose();
vector.remove(neb);
```
oder

```
NEBEN neb = (NEBEN) vector.lastElement();
neb.dispose();
vector.remove(neb);
```

Ich weiss nicht warum ich das "casten" sollte (Tipp von Eclipse)
aber es hat schön funktioniert.

Der Computer speichert leider alles und jedes neu erzeugte
NEBEN kriegt neue "Ausweisnummer", 
aber das ist vieleicht das Aroma.

Kann man sich überzeugen, dass die beseitigten Instanzen 
nicht nur als JFrames vom Bildschirm weg sind 
aber in der Tat nicht mehr existieren?

Ich danke jedenfalls.


----------



## ARadauer (15. Jun 2007)

wenn du wirklich Vector<NEBEN> nebenVector = new Vector<NEBEN>();  geschrieben hast, ist eigentlich kein Cast notwendig.


```
Neben temp = nebenVector.get(nebenVector.size()); 
            temp.setVisible(false); 
            nebenVector.remove(nebenVector.size());
```

somit dürfte kein verweis mehr auf das objekt existieren und beim nächsten lauf des gc, ist es definitiv nicht mehr da


----------



## Gast (15. Jun 2007)

DANKR SCHÖN, 

Im Prinzip war es eine kosmetische Frage,
weil die Instanzen, die ich evtl. vernischten würde,
in meiner Applikation sehr klein sind,
tun nichts mehr als nur auf dem Bildschirm aussehen,
und belasten den Arbeitsspeicher vermutlich nur geringfügig.

Ich wollte nur den gebliebenen Rest der Elemente im Vector
irgendwie demokratisch verwalten. So jabe ich mir angenommen,
wenn es nur drei Komponenten im Vektorbleiben,
sind der VM nur drei bekannt.

danke sehr, klein-odd


----------

