Eu quero lidar com eventos de estágio (ou seja, esconder) da minha classe de controlador. Então, tudo o que tenho a fazer é adicionar um ouvinte via
((Stage)myPane.getScene().getWindow()).setOn*whatIwant*(...);
mas o problema é que a inicialização começa logo após
Parent root = FXMLLoader.load(getClass().getResource("MyGui.fxml"));
e antes
Scene scene = new Scene(root);
stage.setScene(scene);
portanto .getScene () retorna nulo.
A única solução alternativa que encontrei por mim mesmo é adicionar um ouvinte a myPane.sceneProperty () e, quando ele se tornar nulo, eu obtenho a cena, acrescente a ele .windowProperty () meu! Goddamn! ouvinte manipulação que finalmente recupero estágio. E tudo termina com a definição dos ouvintes desejados para organizar eventos. Acho que há muitos ouvintes. É a única maneira de resolver meu problema?
load()
método. (Além disso, o javadoc emgetController
parece que deveria estarsetController
.)Tudo que você precisa é fornecer
AnchorPane
um ID, e então você pode obtê-lo aStage
partir dele.A partir daqui, você pode adicionar o
Listener
que você precisa.Editar: conforme declarado pelo EarthMind abaixo, não precisa ser o
AnchorPane
elemento; pode ser qualquer elemento que você definiu.fonte
element
pode ser qualquer elemento com umfx:id
nessa janela:Stage stage = (Stage) element.getScene().getWindow();
. Por exemplo, se você tiver apenas umButton
com umfx:id
em suas janelas, use-o para obter o palco.getScene()
ainda retornanull
.bgimage.sceneProperty().addListener((observableScene, oldScene, newScene) -> { if (oldScene == null && newScene != null) { bgimage.fitWidthProperty().bind(newScene.widthProperty()); ... } });
Eu sei que não é a resposta que você quer, mas IMO as soluções propostas não são boas (e o seu próprio jeito é). Por quê? Porque dependem do estado do aplicativo. No JavaFX, um controle, uma cena e um palco não dependem um do outro. Isso significa que um controle pode viver sem ser adicionado a uma cena e uma cena pode existir sem ser anexada a um palco. E então, em um instante t1, o controle pode ser anexado a uma cena e no instante t2, essa cena pode ser adicionada a um palco (e isso explica por que são propriedades observáveis uma da outra).
Portanto, a abordagem que sugere obter a referência do controlador e invocar um método, passando o estágio para ele, adiciona um estado à sua aplicação. Isso significa que você precisa invocar esse método no momento certo, logo após a criação do estágio. Em outras palavras, você precisa seguir uma ordem agora: 1- Crie a etapa 2- Passe esta etapa criada para o controlador por meio de um método.
Você não pode (ou não deve) alterar esta ordem nesta abordagem. Então você perdeu a apatridia. E em software, geralmente, o estado é mau. Idealmente, os métodos não devem exigir nenhuma ordem de chamada.
Então, qual é a solução certa? Existem duas alternativas:
1- Sua abordagem, nas propriedades de escuta do controlador para entrar no palco. Acho que essa é a abordagem certa. Como isso:
2- Você faz o que precisa onde cria o
Stage
(e não é isso que você quer):fonte
pane
a uma cena que já está anexada a um palco, isso não vai funcionar, certo? Não deveria haver uma verificação nosceneProperty
ouvinte e apenas adicionar ostageProperty
ouvinte se o estágio ainda for nulo? Caso contrário, faço o que preciso imediatamente?A maneira mais simples de obter o objeto de estágio no controlador é:
Adicione um método extra na própria classe de controlador criada como (será um método setter para definir o estágio na classe de controlador),
Coloque o controlador no método de início e defina o estágio
Agora você pode acessar o estágio no controlador
fonte
stage
assim.Atribua fx: id ou declare a variável para / de qualquer nó: âncora, botão, etc. Em seguida, adicione o manipulador de eventos a ele e, dentro desse manipulador de eventos, insira o código fornecido abaixo:
Espero que funcione para voce!!
fonte
Platform.runLater funciona para evitar a execução até que a inicialização seja concluída. Nesse caso, quero atualizar a visualização de uma lista sempre que redimensiono a largura da janela.
no seu caso
fonte
Você pode obter com
node.getScene
, se você não ligar dePlatform.runLater
, o resultado é um valor nulo.exemplo de valor nulo:
exemplo sem valor nulo:
fonte