我有一个由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中,然后从控制器链接到此以切换可见性就可以了。