JFrame modular aufrufen

  • Themenstarter Themenstarter Kekrops
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
K

Kekrops

Gast
Hallo,

ich habe ein Problem. :lol:

Also ich will ein JFrame modular aufrufen, so das er erst im Code weitergeht nachdem das Frame geschlossen wurde.
Hier mal ein Beispiel:
Code:
AdminMainWin myMainWin = new AdminMainWin();
S_ID = myMainWin.showWin(AdminMainWin.SHOW_SELECT);
updateInfo();

Er soll also erst dann die Funktion updateInfo(); aufrufen nachdem das AdminMainWin (diese Klasse erbt von JFrame) geschlossen wurde und die S_ID gefüllt wurde.
Wäre super wenn mir da jmd. helfen könnte.

Danke Kai
 
lass deine klasse nicht von JFrame sonder von JDialog erben - denn kannst du einfach über setModal bzw. im Konstruktor modal setzen
 
deathbyaclown hat gesagt.:
lass deine klasse nicht von JFrame sonder von JDialog erben - denn kannst du einfach über setModal bzw. im Konstruktor modal setzen

Daran haben wir auch schon gedacht, nur leider geht dann die komplette Fensterfunktionalität (grösse ändern, etc.) verloren..und das wollen wir ja auch nicht 🙁

Kai
 
Dann musst du dein Code aufteilen, irgendwie sowas:
Code:
public class Blupp extends WindowAdapter{
  JFrame frame = new JFrame();

  public Blupp(){
    frame.addWindowListener( this );
  }

  public void work(){
    beforFrame();
    frame.setVisible( true );
  }

  public void windowClosed( WindowEvent e ){
    afterFrame();
  }

  public void beforFrame(){
  }

  public void afterFrame(){
  }
}
 
Kekrops hat gesagt.:
Daran haben wir auch schon gedacht, nur leider geht dann die komplette Fensterfunktionalität (grösse ändern, etc.) verloren..und das wollen wir ja auch nicht 🙁
Äh - nein !

beiden erben von Component und die verfügt über setSize methoden....
 
deathbyaclown hat gesagt.:
Kekrops hat gesagt.:
Daran haben wir auch schon gedacht, nur leider geht dann die komplette Fensterfunktionalität (grösse ändern, etc.) verloren..und das wollen wir ja auch nicht 🙁
Äh - nein !

beiden erben von Component und die verfügt über setSize methoden....


Ja aber es ist ja nicht nur die Grössenänderung. Bei Dialogen hat man ja auch keine Menues...ein weiteres schweres Problem.

Kai
 
Beni hat gesagt.:
Dann musst du dein Code aufteilen, irgendwie sowas:
Code:
public class Blupp extends WindowAdapter{
  JFrame frame = new JFrame();

  public Blupp(){
    frame.addWindowListener( this );
  }

  public void work(){
    beforFrame();
    frame.setVisible( true );
  }

  public void windowClosed( WindowEvent e ){
    afterFrame();
  }

  public void beforFrame(){
  }

  public void afterFrame(){
  }
}

die Lösung sieht zwar elegand aus, aber Leider geht das auch nciht, da das Frame von verschiedenen anderen Frames aufgerufen wird die immer andere sachen fordern, bzw. Methoden aufrufen nachdem das Fenster geschlossen wurde.

Kai
 
Wie wäre es, wenn du dem Fenster irgendein Objekt setzt, nachdem du das show machst, dich in den wait-Pool des Objekts legst, und wenn du das Fenster schließt, auf das Objekt synchronisierst, und notifyAll von dem Objekt aufrufst!
 
Code:
    // Monitor, der zum synchronisieren verwendet wird    
    private Object monitor = null;
    
    public MyFrame(){
        monitor = new Object();

        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                synchronized(monitor){
                    monitor.notifyAll();
                }
            }
        });
    }

    public void setVisible(boolean b){
        super.setVisible(b);
        synchronized(monitor){
            try{
                monitor.wait();
            }catch(InterruptedException ex){
            }
        }
    }


    //Aufruf von aussen:

    MyFrame mf = new MyFrame();
    mf.setVisible(true);
    //und hier wartet er jetzt, bis du fertig bist

Ich habe es so ausprobiert und es funktioniert
 
Niki hat gesagt.:
Code:
    // Monitor, der zum synchronisieren verwendet wird    
    private Object monitor = null;
    
    public MyFrame(){
        monitor = new Object();

        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                synchronized(monitor){
                    monitor.notifyAll();
                }
            }
        });
    }

    public void setVisible(boolean b){
        super.setVisible(b);
        synchronized(monitor){
            try{
                monitor.wait();
            }catch(InterruptedException ex){
            }
        }
    }


    //Aufruf von aussen:

    MyFrame mf = new MyFrame();
    mf.setVisible(true);
    //und hier wartet er jetzt, bis du fertig bist

Ich habe es so ausprobiert und es funktioniert

Hallo,

also bei mir bleibt er dann stehen und ich kann nix mehr in den Fenstern machen...es bleibt alles grau. Und mit dem Debugger hab ich gesehn das er dann halt bei monitor.wait(); stehen bleibt (das wäre ja ok wenn ich mit dem anderen fenster arbeiten könnte) 🙁

Kai
 
Rufst du das setVisible(true) innerhalb des Konstruktors auf, wenn ja, solltest du das dort raus nehmen, und nachdem du den Frame instanzierst von aussen setzen, sonst blockierst du den AWT-Thread
 
Hi, ich hab das selbe Problem wie Kekrops.
Hab auch schon das probiert was Niki gesagt hat, aber das Ergebnis is wie Kekrops beschrieben hat: nach setVisible(true) tut sich gar nix. setVisible hab ich auch nich im Konstruktor aufgerufen.

Ich hoffe, jemand kann mir helfen...

Rico
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben