【发布时间】:2020-04-01 05:21:00
【问题描述】:
我有一个由其他地方包含的 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 在屏幕上仍然可见,但 print 语句表示在将 visible 属性设置为 false 后,它现在为 false。这里发生了什么?我正在使用 JavaFX 8u60。
【问题讨论】:
-
BorderTwoController不会成为场景图的一部分;它只是一个恰好扩展了Node的控制器。修改不属于场景的节点的属性根本不会影响渲染结果。如果您正在寻找Custom Component approach:它的实现方式有点不同,如果您使用这种方法,您还需要更改在其他 fxml 中使用它的方式。 -
@fabian 我不想在这种情况下使用自定义组件,因为 BorderTwo 永远不会在其他地方重用(我在应用程序的其他地方使用自定义组件来处理将重新获得的东西)多次使用)。您是否有一个链接来解释为什么 BorderTwoController 没有包含在场景图中?我以为这就是 fx:include 所做的?
-
啊,是的,我刚刚意识到我做错了什么以及你的意思。我将添加我的解决方案作为答案。谢谢!