【问题标题】:JavaFX Toggle visibility of self within controllerJavaFX 在控制器中切换 self 的可见性
【发布时间】: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 所做的?
  • 啊,是的,我刚刚意识到我做错了什么以及你的意思。我将添加我的解决方案作为答案。谢谢!

标签: java javafx javafx-8


【解决方案1】:

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

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,然后从控制器链接到它以切换可见性就可以了。

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2020-09-20
    • 2011-04-08
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多