2015-10-03 18 views
6

Bir açık varsa, JavaFX'te mevcut açılmış Sahne Alanı'nı elde etmenin bir yolu var mı? BöyleJavaFX'te şu an açılan sahne nasıl alınır?

şey:

Stage newStage = new Stage(); 
newStage.initOwner(JavaFx.getCurrentOpenedStage()); //Like this 
+1

AFAIK Bunu yapmanın bir yolu yoktur. Bunun bağlamı nedir? Belki de istediğini yapmak için başka bir yol var. Bu, bir kullanıcı eylemine yanıt olarak, node.getScene(). GetWindow() 'ile bir düğüm içeren pencereyi içeren pencereyi her zaman alabilir. –

+0

Bildirim, bir iş parçacığı içinde "sonsuz" döngü içinde gösterilir. Bu iş parçacığı için, herhangi bir pencereye başvuru yok, çünkü iş parçacığı sisteme giriş yaptıktan sonra kapanan ilk uygulama penceresinden (oturum açma penceresi) başlatılır, ancak iş parçacığı çalışmaya devam eder. –

cevap

9

bunun için yerleşik bir işlevsellik var. Çoğu durumda, kullanıcı eyleminin sonucu olarak yeni bir Stage açarsınız, böylece "geçerli" pencereyi almak için eylemin gerçekleştirildiği düğümde getScene().getWindow() numaralı telefonu arayabilirsiniz.

Diğer kullanım durumlarında, geçerli pencereleri kendiniz izlemek için kod yazmanız gerekir. Elbette, birden çok pencere açık olabilir, bu yüzden onları bir tür koleksiyonda izlemeniz gerekir. Açılış ve kapanış aşamaları için aşamaları yönetmek ve olay işleyicilerini kaydetmek için bir fabrika sınıfı oluşturmanızı öneririm, böylece bir özelliği ve/veya listeyi güncelleyebilirsiniz. Muhtemelen bunun bir singleton olmasını istersiniz. İşte bir örnek uygulama: burada getOpenStages() gözlemlenebilir açık aşamalar listesi sunar - sonuncusu en son açılan - ve currentStageProperty() odaklanmış aşamayı (varsa) verir. Kesin uygulamanız tam ihtiyacınıza göre farklı olabilir. Bu sadece StageFactory.INSTANCE.registerStage(...) yöntemine StageFactory.INSTANCE.createStage() elde veya başka bir yerde oluşturulan ve geçen aşamaları izlemenize olanak sağlayan

public enum StageFactory { 
    INSTANCE ; 

    private final ObservableList<Stage> openStages = FXCollections.observableArrayList(); 

    public ObservableList<Stage> getOpenStages() { 
     return openStages ; 
    } 

    private final ObjectProperty<Stage> currentStage = new SimpleObjectProperty<>(null); 
    public final ObjectProperty<Stage> currentStageProperty() { 
     return this.currentStage; 
    } 
    public final javafx.stage.Stage getCurrentStage() { 
     return this.currentStageProperty().get(); 
    } 
    public final void setCurrentStage(final javafx.stage.Stage currentStage) { 
     this.currentStageProperty().set(currentStage); 
    } 

    public void registerStage(Stage stage) { 
     stage.addEventHandler(WindowEvent.WINDOW_SHOWN, e -> 
       openStages.add(stage)); 
     stage.addEventHandler(WindowEvent.WINDOW_HIDDEN, e -> 
       openStages.remove(stage)); 
     stage.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { 
      if (isNowFocused) { 
       currentStage.set(stage); 
      } else { 
       currentStage.set(null); 
      } 
     }); 
    } 

    public Stage createStage() { 
     Stage stage = new Stage(); 
     registerStage(stage); 
     return stage ; 
    } 

} 

Not, bu nedenle kod bu şartı ile işbirliği yapmak vardır. Öte yandan, aşamalarınızı başlatan kodun merkezileştirilmesi şansını verir, aksi takdirde yararlı olabilir.

İşte bu kullanarak basit bir örnek:

import javafx.application.Application; 
import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.stage.WindowEvent; 

public class SceneTrackingExample extends Application { 

    int count = 0 ; 

    @Override 
    public void start(Stage primaryStage) { 
     StageFactory factory = StageFactory.INSTANCE ; 
     factory.registerStage(primaryStage); 

     configureStage(primaryStage); 
     primaryStage.show(); 
    } 

    private void configureStage(Stage stage) { 
     StageFactory stageFactory = StageFactory.INSTANCE; 
     Stage owner = stageFactory.getCurrentStage() ; 
     Label ownerLabel = new Label(); 
     if (owner == null) { 
      ownerLabel.setText("No owner"); 
     } else { 
      ownerLabel.setText("Owner: "+owner.getTitle()); 
      stage.initOwner(owner); 
     } 
     stage.setTitle("Stage "+(++count)); 
     Button newStage = new Button("New Stage"); 
     newStage.setOnAction(e -> { 
      Stage s = stageFactory.createStage(); 
      Stage current = stageFactory.getCurrentStage() ; 
      if (current != null) { 
       s.setX(current.getX() + 20); 
       s.setY(current.getY() + 20); 
      } 
      configureStage(s); 
      s.show(); 
     }); 

     VBox root = new VBox(10, ownerLabel, newStage); 
     root.setAlignment(Pos.CENTER); 
     stage.setScene(new Scene(root, 360, 150)); 
    } 

    public enum StageFactory { 
     INSTANCE ; 

     private final ObservableList<Stage> openStages = FXCollections.observableArrayList(); 

     public ObservableList<Stage> getOpenStages() { 
      return openStages ; 
     } 

     private final ObjectProperty<Stage> currentStage = new SimpleObjectProperty<>(null); 
     public final ObjectProperty<Stage> currentStageProperty() { 
      return this.currentStage; 
     } 
     public final javafx.stage.Stage getCurrentStage() { 
      return this.currentStageProperty().get(); 
     } 
     public final void setCurrentStage(final javafx.stage.Stage currentStage) { 
      this.currentStageProperty().set(currentStage); 
     } 

     public void registerStage(Stage stage) { 
      stage.addEventHandler(WindowEvent.WINDOW_SHOWN, e -> 
        openStages.add(stage)); 
      stage.addEventHandler(WindowEvent.WINDOW_HIDDEN, e -> 
        openStages.remove(stage)); 
      stage.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { 
       if (isNowFocused) { 
        currentStage.set(stage); 
       } else { 
        currentStage.set(null); 
       } 
      }); 
     } 

     public Stage createStage() { 
      Stage stage = new Stage(); 
      registerStage(stage); 
      return stage ; 
     } 

    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
3

Java 9 javafx.stage.Window.getWindows() yöntemin ilave edilerek bunu mümkün kılar. Bu nedenle, yalnızca Windows listesi alabilir ve hangisi olduğunu göremezsiniz (

List<Window> open = Stage.getWindows().filtered(window -> window.isShowing()); 
İlgili konular