JavaFX 在控制器中切换自身的可见性

JavaFX Toggle visibility of self within controller

我有一个 StackPane,它由其他地方包含的 BorderPanes 组成。除了第一个窗格之外的所有窗格都设置为 visible=false。这是我所拥有的一个通用示例:

Stacks.fxml

<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.fxml

<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());
        });
    }
}

应用程序启动时不显示边框二(正确)。

"show border two" 按钮显示边框二(正确)。

"close"按钮不隐藏两个窗格的边框

有趣的是,打印语句说可见的 属性 在设置为 false 后现在是 false,尽管 BorderPane 在屏幕上仍然可见。这里发生了什么?我正在使用 JavaFX 8u60。

感谢评论找到了解决方案。我混淆了控制器和自定义组件。通过更改解决它:

BorderTwo.fxml

<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.fxml 的控制器。添加一个 fx:id 到 BorderTwo.fxml,然后从控制器链接到它以切换可见性工作得很好。