2017-02-12 4 views
0

Попытка установить сцену как владельца всплывающего окна, но всплывающее окно не отображается, если владелец не является основной стадией приложения.JavaFX Popup не отображается, если окно владельца не отображается

public void popup(Window owner, String mensagem) { 
    Popup popup = new Popup(); 
    popup.setAutoHide(true); 
    popup.setHideOnEscape(true); 

    Label label = new Label(mensagem); 
    label.setBackground(new Background(new BackgroundFill(Color.CORNSILK, null, null))); 

    popup.getContent().add(label); 
    popup.setOnShown((event) -> { 
     FadeTransition fade = new FadeTransition(Duration.seconds(5), label); 
     fade.setOnFinished((e) -> { 
      popup.hide(); 
     }); 
     fade.play(); 
    }); 

    popup.show(owner); 
} 

Ребенок Этап:

public class JanelaModal extends Stage { 

    public JanelaModal(String title) { 
     super(StageStyle.DECORATED); 
     setTitle(title); 
     initOwner(Main.getInstance().getStage()); 
     initModality(Modality.APPLICATION_MODAL); 
     setResizable(false); 
    } 

    public void setGui(Parent gui) { 
     if (getScene() != null) { 
      getScene().setRoot(gui); 
     } else { 
      setScene(new Scene(gui)); 
     } 
    } 

} 

ответ

1

Вы должны вызвать show(...) на вашем этапе ребенка, прежде чем показывать всплывающее окно.

Использование вашего класса JanelaModal Я написал простое тестовое приложение Java FX. Это Основной класс

public class Main extends Application { 

    private static Main instance; 
    private Stage stage; 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     instance = this; 
     this.stage = stage; 
     Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root, 300, 275)); 
     //primaryStage.show(); //Don't show main stage 

     JanelaModal modal = new JanelaModal("TEST"); 
     modal.setWidth(300); 
     modal.setHeight(300); 
     modal.show(); 
     popup(modal, "Test message"); 
    } 

    //Copied and pasted from the question post 
    public void popup(Window owner, String mensagem) { 
     Popup popup = new Popup(); 
     popup.setAutoHide(true); 
     popup.setHideOnEscape(true); 

     Label label = new Label(mensagem); 
     label.setBackground(new Background(new BackgroundFill(Color.CORNSILK, null, null))); 

     popup.getContent().add(label); 
     popup.setOnShown((event) -> { 
      FadeTransition fade = new FadeTransition(Duration.seconds(5), label); 
      fade.setOnFinished((e) -> { 
       popup.hide(); 
      }); 
      fade.play(); 
     }); 

     popup.show(owner); 
    } 

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

    public static Main getInstance() { 
     return instance; 
    } 

    public Stage getStage() { 
     return stage; 
    } 
} 

И это результат

The test application

Всплывающее показан в «детской» стадии. Если вы звоните

popup(modal, "Test message"); 

Но вы не вызываете

modal.show(); 

Всплывающее (и этап) не будет отображаться.

Надеюсь, я помог, как-то :)

+1

Спасибо за ответ. Кажется, окно владельца должно быть видимым, когда отображается всплывающее окно. В моем случае дочернее окно закрывается, поэтому главное окно должно быть владельцем всплывающего окна. Интересно, почему в документации не упоминается, что это не так очевидно. – ceklock