2014-11-18 2 views
1

В настоящее время я изучаю новые функции Java JDK 8u40, и должен сказать, что мне очень нравится встроенный диалог. По сравнению с ControlsFX фоновый эффект отсутствует, когда диалог открыт (ControlsFX заставил фон выглядеть темнее). Я также хотел бы сделать это с новым диалоговым классом в JavaFX. Я использую следующий код:JavaFX: применить фоновый эффект, когда диалог открыт

TextInputDialog dialog = new TextInputDialog(); 
dialog.initOwner(null); 
dialog.initStyle(StageStyle.UNDECORATED); 
dialog.setHeaderText(“Please fill in a new number“); 
dialog.setContentText(“New number:”); 

//Check if the optional is filled in 
Optional<String> newAmount = dialog.showAndWait(); 
if (result.isPresent()){ 
    System.out.println(“New number: " + result.get()); 
} 

Я не нашел полезных частей в классе диалога. Я попробовал этот код, но это немного Hacky, и немного медленно:

myMainFlowPane.setOpacity(0.5); 
// ..... dialog code ..... // 
myMainFlowPane.setOpacity(1.0); 

Вы должны сказать, что должен быть способ сборки в течение этого. Кто-нибудь из вас знает, как это сделать?

Любая помощь очень ценится!

ответ

4

Вы можете легко реализовать тот же эффект. Чтобы добавить этот непрозрачный слой между вашей сценой и диалогом, просто добавьте невидимую область вверху сцены и сделайте ее видимой с некоторой прозрачностью прямо перед отображением диалогового окна, после того, как она будет закрыта.

@Override 
public void start(Stage primaryStage) { 

    final Region opaqueLayer = new Region(); 
    opaqueLayer.setStyle("-fx-background-color: #00000044;"); 
    opaqueLayer.setVisible(false); 

    Button btn = new Button("Show Dialog"); 
    btn.setOnAction(t -> { 
     TextInputDialog dialog = new TextInputDialog(); 
     dialog.initOwner(null); 
     dialog.initStyle(StageStyle.UNDECORATED); 
     dialog.setHeaderText("Please fill in a new number"); 
     dialog.setContentText("New number:"); 

     opaqueLayer.setVisible(true); 
     //Check if the optional is filled in 
     Optional<String> result = dialog.showAndWait(); 
     opaqueLayer.setVisible(false); 
     if (result.isPresent()){ 
      System.out.println("New number: " + result.get()); 
     } 
    }); 

    StackPane root = new StackPane(btn,opaqueLayer);   
    Scene scene = new Scene(root, 800, 600); 

    primaryStage.setTitle("Hello World!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 

    opaqueLayer.resizeRelocate(0, 0, scene.getWidth(), scene.getHeight()); 
} 

Это повлияет только на сцену, но вы можете сделать ее расширяемой на весь экран.

+0

Я снова проверял этот ответ, и он работает. Тем не менее, он все еще немного медленный. Медленно, чем хотелось бы. – bashoogzaad

+0

Для меня это прекрасно работает. Если он медленный, как насчет того, чтобы добавить некоторый эффект затухания в/из в параллельный слой? –

Смежные вопросы