JavaFX Переключить видимость себя внутри контроллера - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть StackPane, состоящий из BorderPane, которые включены из других источников. Все, кроме первой панели, имеют значение visible = false. Вот обобщенный пример того, что у меня есть:

Stacks.f xml

<StackPane fx:controller="StackController">
    <fx:include source="borderOne.fxml" />
    <Button fx:id="showBorderTwo" text="Show Border Two" />
    <fx:include fx:id="borderTwo" source="borderTwo.fxml" visible="false"/>
</StackPane>

StackController имеет:

public class StackController extends StackPane implements Initializable {
    @FXML
    Button showBorderTwo;
    @FXML
    BorderPane borderTwo;

    public void initialize(URL location, ResourceBundle resources) {
        showBorderTwo.setOnAction((event) -> {
            borderTwo.setVisible(true);
        });
    }
}

Теперь эта часть работает нормально. Однако BorderTwo имеет:

BorderTwo.f xml

<BorderPane fx:controller="BorderTwoController">
    <Button fx:id="close" text="Close" />
</BorderPane>

BorderTwoController

public class BorderTwoController extends BorderPane implements Initializable {
    @FXML
    Button close;

    public void initialize(URL location, ResourceBundle resources) {
        close.setOnAction((event) -> {
            setVisible(false);
            System.out.println("visible: " + visibleProperty().toString());
        });
    }
}

Приложение запускается без отображения второй границы (правильно).

Кнопка «Показать границу два» отображает границу два (правильно).

Кнопка «Закрыть» не скрывает панель двух границ .

Интересно, что оператор печати говорит, что свойство visible теперь имеет значение false после установки значения false, несмотря на то, что BorderPane остается видимым на экране. Что тут происходит? Я использую JavaFX 8u60.

1 Ответ

1 голос
/ 01 апреля 2020

Разобрался с решением благодаря комментарию. Я путал контроллеры и пользовательские компоненты. Решил это, изменив:

BorderTwo.f xml

<BorderPane fx:id="menu" fx:controller="BorderTwoController">
    <Button fx:id="close" text="Close" />
</BorderPane>

BorderTwoController. java

public class BorderTwoController implements Initializable {
    @FXML
    BorderPane menu;

    @FXML
    Button close;

    public void initialize(URL location, ResourceBundle resources) {
        close.setOnAction((event) -> {
            menu.setVisible(false);
        });
    }
}

BorderTwoController, несмотря на расширение BorderPane, фактически не был StackPane, поскольку это был просто контроллер для BorderTwo.f xml. Добавление fx: id к BorderTwo.f xml и последующая привязка к нему из контроллера для переключения видимости работала просто отлично.

...