Элемент JavaFX инициализируется размером 0

#css #javafx #fxml

#css #javafx #fxml

Вопрос:

У меня проблема, когда мой FXML инициализирован, а их значения прослушиваются слушателями.

Итак, мое главное окно представляет собой BorderPane

  • TOP = menu.fxml
  • CENTER = center1.fxml
  • BOTTOM = нижний колонтитул.fxml

Когда я нажимаю на одну из кнопок в center1Controller ЦЕНТРЕ, fxml должен измениться на center2.fxml .

У center2.fxml меня есть Pane , который должен быть Anchor.anchorLeft=60 и anchorTop = anchorBottom

Я был создан слушателем :

 public void addTopOffsetListener() {

    this.logonWindowPane.heightProperty().addListener(new ChangeListener<Number>() {            
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            double y = (newValue.doubleValue() - logonForm.getHeight()) / 2;
            logonForm.setLayoutY(y);  
        }
    });
}
  

Но один из моих экранов перезагружает форму входа в систему в неправильном месте. Когда я выполняю отладку, инициализация getHeight() возвращает 0.

Он размещается в правильном месте после изменения размера окна.

Я пробовал фиксированный размер этого элемента в FXML и в CSS.

На самом деле я нашел обходной путь. Когда я инициализирую screen2Controller a, я добавил эту строку

 public void initialize(URL url, ResourceBundle rb) {
  this.logonForm.resize(300, 400);
}
  

Вот мой Screen2 fxml :

 <AnchorPane id="logonWindowPane" fx:id="logonWindowPane" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="genealogytree.application.fxmlcontrollers.LogonWindowController">
    <stylesheets>
        <URL value="@../styles/application_logon.css" />
    </stylesheets>
   <children>
        <Pane id="logonForm" fx:id="logonForm" prefHeight="400" prefWidth="300" minWidth="300" minHeight="400"   styleClass="projectPane"   AnchorPane.rightAnchor="60.0" />
   </children>  
</AnchorPane>
  

И FXML элемента там, который я ввел в logonForm :

 <Pane styleClass="logonFXForm" prefHeight="400" prefWidth="300" minWidth="300" minHeight="400"     xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="genealogytree.application.fxmlcontrollers.LogonFormController">
    <stylesheets>
        <URL value="@../styles/application_logon.css" />
    </stylesheets>
    <children>
      <JFXPasswordField focusColor="#1f7f6a" layoutX="38.0" layoutY="133.0" maxWidth="224.0" minWidth="224.0" prefHeight="48.0" prefWidth="224.0" promptText="Password" unFocusColor="#253930">
         <font>
            <Font size="14.0" />
         </font>
      </JFXPasswordField>
      <JFXTextField focusColor="#1f7f6a" layoutX="38.0" layoutY="54.0" maxWidth="224.0" minWidth="224.0" prefHeight="48.0" prefWidth="224.0" promptText="Login" unFocusColor="#253930">
         <font>
            <Font size="14.0" />
         </font>
      </JFXTextField>
      <JFXButton buttonType="RAISED" graphicTextGap="8.0" layoutX="61.0" layoutY="224.0" prefHeight="48.0" prefWidth="178.0" ripplerFill="#32ae8f" styleClass="jfxButton" text="CONNECT" textAlignment="CENTER">
         <font>
            <Font name="System Bold" size="18.0" />
         </font>
      </JFXButton>
      <Hyperlink layoutX="38.0" layoutY="305.0" prefHeight="25.0" prefWidth="250.0" text="Do not have an Account ? " />
      <Hyperlink layoutX="38.0" layoutY="340.0" prefHeight="25.0" prefWidth="250.0" text="Forgotten Password ? " />

   </children>
</Pane>
  

Но есть другой способ решить мою проблему только в FXML или CSS?

Комментарии:

1. У вас есть параметры свойств в конструкторе сцен, попробуйте использовать их для открытия файла fxml и установки панели в нужное место

2. это не работает, потому что в момент инициализации он сбрасывается. На самом деле в SceneBuilder моя панель находится сверху. И после инициализации верхняя часть logonForm находится по центру (вертикально) LogonWindow (center2).

3. Пожалуйста, посмотрите на эту ссылку docs.oracle.com/javafx/2/layout/builtin_layouts.htm существуют встроенные макеты, и вы можете использовать их, если это не помогает, пожалуйста, попробуйте скрывать и показывать объекты с помощью метода setVisible в вашей сцене.

4. Нет, это не помогает.

5. есть еще идеи??