Frames im Vector

Hallo !!

Bei mir klappt folgendes nicht so wie es soll:

public class MainFrame extends JFrame{

… (neue Objekte vom eigenen Typ „Document“ werden erzeugt und

  • siehe weiter unten - durch die Klasse „Document“ selber
    geschlossen.

public void run(){

while(true) {
frameVector.clear();
Frame[] frames;
frames = getFrames();
for(i = 0; i

Also … hab mal etwas in den Sourcen gestöbert. Die Klasse java.awt.Frame holt sich aus dem Application-Kontext einen Vektor, der die Referenzen auf alle Frames, die in der Anwendung instanziiert wurden. Die Frames werden da erst wieder rausgenommen, wenn die Methode finalize() aufgerufen wird.

Äh, nach dem Bild, das ich bisher von Java hatte, wird finalize doch nur dann aufgerufen, wenn a) die Garbage-Collection angestoßen wird (was uu ewig dauern kann) und b) keine Referenzen mehr auf den Frame bestehen. Im Vector ist aber die Referenz solange drin, bis finalize aufgerufen wird. *grins* … sieht mir nach nem Bug aus, oder!!!

Auf jeden Fall kannst Du im WindowListener bei einem close die Methode removeFromFrameList() selbst aufrufen, wodurch Dein Problem gelöst sein sollte.

Gruß
Benky

Äh, nach noch ein paar Versuchen/Untersuchungen:
Kommando zurück, kein Bug!!

Im Vector wird nur eine weakReference gespeichert (war mir auch neu), das heißt dadurch kann eben doch finalize aufgerufen werden. Aber wie gehabt, die weakReference bleibt solange in der Liste.

Ich denke es ist am einfachsten, wenn du dir selbst eine verlässliche Liste erzeugst, in der DU die Documente registrierst und beim close auch wieder entfernst.

Gruß
Benky

Hallo Benky !

Also … hab mal etwas in den Sourcen gestöbert.

WOW !! Soviel Arbeit hast Du Dir für mich gemacht ?!?

Äh, nach dem Bild, das ich bisher von Java hatte,
… sieht mir nach nem Bug aus, oder!!!

Mir eigentlich auch !! :smile:)

Auf jeden Fall kannst Du im WindowListener bei einem close die
Methode removeFromFrameList() selbst aufrufen, wodurch Dein
Problem gelöst sein sollte.

Woher bekomme ich ‚removeFromFrameList‘ ? Ich habe auch nix darüber gefunden !! Mit welcher Vers. arbeitetst Du ? Ich habe hier 1.2.2 .

Äh, nach noch ein paar Versuchen/Untersuchungen:
Kommando zurück, kein Bug!!

Neee ?!??

Im Vector wird nur eine weakReference gespeichert (war mir auch
neu), das heißt dadurch kann eben doch finalize aufgerufen
werden. Aber wie gehabt, die weakReference bleibt solange in
der Liste.

Wie kriege ich die dort raus ?!?

… und wieder kann ich nur sagen: ‚WOW !! Soviel Arbeit hast Du Dir für mich gemacht ?!?‘

Nochmals 1000 Dank !!

Gruß
Frank

Hi Frank,

wenn du denkst ich hab das für dich gemacht, dann haste dich aber geschnitten, schließlich hab ICH ja was dabei gelernt!! ;o)

Aber mal ernst bei Seite, wie gesagt würd ich dir voschlagen wenn du eine solche Liste brauchst, nochmal ne eigene zu erstellen. Ob du nun -wie in der original-Schleife- das Array hernimmst und dir den Inhalt in nen Vector kopierst oder den Vector entsprechend pflegst macht wohl keinen Unterschied!

Ich würde dir hierfür ein Singleton empfehlen.

public class SingleFrameVector expands Vector {
SingleFrameVector sfv=null;

private SingleFrameVector() {};
public static SingleFrameVector getInstance() {
if( sfv==null ) sfv=new SingleFrameVector();
return sfv;
}
}

public class Document extends JFrame {
public Document() {
SingleFrameVector s=SingleFrameVector.getInstance();
s.add( this );
}

… und im Close-Event-Handler entsprechend:
SingleFrameVector s=SingleFrameVector.getInstance();
s.remove( this );

}

Gruß
Benky

Morgen Benky !

Danke !!

Frank