javafx将parent borderpane设置为null

时间:2015-05-27 13:38:44

标签: java javafx fxml

我有2个fxml

FXML A: 它包含ID为fx的边框:id =" UnitBorderPane"

FXML B: 它包含ID为fx的锚点:id =" UnitForm"

我加载" FXML B"在左侧的borderpane A

FXMLLoader loader = new
FXMLLoader(getClass().getResource("/projectname/unit/UnitForm.fxml"));
Pane pane = (Pane) loader.load();
UnitBorderPane.setLeft(pane);

它是一种fxml形式,所以我们有一个带动作的按钮

<Button layoutX="102.0" layoutY="169.0" mnemonicParsing="false" onAction="#saveUnit" text="Save" />

如何隐藏FXML一个BorderPane?

@FXML
private void saveUnit(ActionEvent event) {    
    BorderPane borpane = (BorderPane)UnitForm.getParent().lookup("#UnitBorderPane");
    borpane.setLeft(null);
}

此代码不起作用,borpane变量为null,因此我无法将borderPane FXML A Left设置为null。

1 个答案:

答案 0 :(得分:0)

我认为应该只是

BorderPane borpane = (BorderPane)UnitForm.getParent();

然而,这些都不是非常强大;例如,如果您决定更改布局结构,则可能需要在各种类中更改许多代码。我会向UnitForm.fxml的控制器添加一个属性,您可以从控制器中查看UnitBorderPane。类似的东西:

public class UnitFormController { // your actual class name may differ....

    private final BooleanProperty saved = new SimpleBooleanProperty();

    public BooleanProperty savedProperty() {
        return saved ;
    }
    public final boolean isSaved() {
        return savedProperty().get();
    }
    public final void setSaved(boolean saved) {
        savedProperty().set(saved);
    }

    // other code as you already have...

    @FXML
    private void saveUnit() {
        setSaved(true);
    }

    // ...
}

然后你做

FXMLLoader loader = 
    new FXMLLoader(getClass().getResource("/projectname/unit/UnitForm.fxml"));
Pane pane = (Pane) loader.load();
UnitFormController controller = loader.getController();
controller.savedProperty().addListener((obs, wasSaved, isNowSaved) -> {
    if (isNowSaved) {
        UnitBorderPane.setLeft(null);
    }
});
UnitBorderPane.setLeft(pane);

现在UnitBorderPane的管理都在一个地方,而不是分成两个控制器,并且没有查找(不健壮)。 UnitForm的控制器只是设置一个属性,让其他控制器按照自己的意愿做出响应。