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,然后从控制器链接到它以切换可见性工作得很好。
我有一个 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,然后从控制器链接到它以切换可见性工作得很好。