我有一个由BorderPanes组成的StackPane,它来自其他地方。除第一个窗格外,所有窗格均设置为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());
        });
    }
}


该应用程序启动时未显示第二个边框(正确)。

“显示两个边框”按钮显示两个边框(正确)。

“关闭”按钮不会隐藏边框两个窗格。

有趣的是,打印语句说,尽管BorderPane在屏幕上仍然可见,但在将其设置为false之后,visible属性现在为false。这里发生了什么?我正在使用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);
        });
    }
}


尽管扩展了BorderPane,但BorderTwoController却实际上不是StackPane,因为它只是BorderTwo.fxml的控制器。将一个fx:id添加到BorderTwo.fxml中,然后从控制器链接到此以切换可见性就可以了。

09-05 09:26