2017-11-02 2 views
0

Lassen Sie uns sagen, ich habe drei Java FX Stufen: A, B und C jeweils mit ihren eigenen offenen Fenster und bin mit dem Ziel für das folgende Verhalten:JFX: Sperren Sie eine Stufe ontop einer anderen Stufe/detect Stufe um

Wenn A nimmt konzentrieren, B sollte ontop und C ontop B erscheinen -> A-B-C

Wenn B Fokus nimmt, sollte vor C und A in den Rücken -> A-C-B

erscheinen Wenn C Fokus nimmt, natürlich -> A-B-C

Ich kenne die toFront() Funktion und habe versucht, die Reihenfolge entsprechend manuell zu erzwingen, indem einfach toFront() auf jede Stufe in der richtigen Reihenfolge aufgerufen wird, wenn eine der Stufen wieder scharf wird, was jedoch zu unerwünschtem Flackern führt, da es offensichtlich keine Möglichkeit gibt, welche Fenster zu bestimmen sind schon an der richtigen Stelle.

Leider kann ich das Modal-Window-System nicht verwenden, da alle Fenster parallel arbeiten müssen.

Gibt es eine Möglichkeit, dies zu erreichen?

Vielen Dank im Voraus!

Antwort

0

hatte gerade das gleiche Problem. Der einzige "Hack", den ich finden konnte, ist, die Reihenfolge zu speichern, in der die Stufen fokussiert wurden, und dann in umgekehrter Reihenfolge durch alle Phasen zu fahren und .toFront() aufzurufen.

Wenn eine Bühne den Fokus bekommt, setze ich mich auf die Liste der offenen Bühnen. Ich blockiere dann den EventHandler globaly, weil jedes Mal, wenn eine Stufe den Aufruf .toFont() erhält, auch der Focus kommt.

Funktioniert gut auf Mac. Funktioniert nicht und zeigt ein seltsames Verhalten unter Windows

this.model.stage.focusedProperty().addListener((ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) -> { 
     if (!mainModel.blockFocusRequest){ 
     if (t1){ 
      try{ 
       mainModel.openWindows.remove(this.model.stage); 
       mainModel.openWindows.add(0,this.model.stage); 
      mainModel.blockFocusRequest = true; 
      for (int i=mainModel.openWindows.size()-1;i>=0;i--){ 
       mainModel.openWindows.get(i).toFront(); 
      }        
      } finally{ 
       mainModel.blockFocusRequest = false; 
      } 
     } 
     } 
    });