如何在JavaFX中将可见性绑定到控制器

如何在JavaFX中将可见性绑定到控制器,java,binding,javafx,javafx-2,fxml,Java,Binding,Javafx,Javafx 2,Fxml,我正在尝试使用JavaFX为我的游戏创建一个菜单。我想有一个“继续”按钮,我只想在游戏运行时看到它。我试图将按钮的可见性属性绑定到控制器,但它似乎不起作用-按钮只是不可见 我环顾了Google和StackExchange,找到了有关如何以编程方式设置它的信息,但我不希望Java代码与FXML的耦合比我真正需要的更紧密 这是我的FXML页面代码 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.geometry.

我正在尝试使用JavaFX为我的游戏创建一个菜单。我想有一个“继续”按钮,我只想在游戏运行时看到它。我试图将按钮的可见性属性绑定到控制器,但它似乎不起作用-按钮只是不可见

我环顾了Google和StackExchange,找到了有关如何以编程方式设置它的信息,但我不希望Java代码与FXML的耦合比我真正需要的更紧密

这是我的FXML页面代码

<?xml version="1.0" encoding="UTF-8"?>
    <?import javafx.geometry.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.scene.text.*?>

<GridPane fx:controller="com.silferein.erq.gui.MenuController" 
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <padding><Insets top="25" right="25" bottom="25" left="25"/></padding>

    <Text id="welcome-text" text="Main Menu" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/>
    <Button text="New" onAction="#handleNew" GridPane.rowIndex="1"/>
    <Button text="Continue" onAction="#handleContinue" GridPane.rowIndex="2" visible="${controller.gameRunning}" />
    <Button text="Load" onAction="#handleLoad" GridPane.rowIndex="3"/>
    <Button text="Save" onAction="#handleSave" GridPane.rowIndex="4"/>
    <Button text="Quit" onAction="#handleQuit" GridPane.rowIndex="5"/>
</GridPane>

知道我做错了什么吗?我的代码已编译,除“继续”之外的所有按钮都可见并工作。

创建布尔属性:

BooleanProperty isGameRunning = new SimpleBooleanProperty(false);
给你的“继续”按钮一个fx:id(比如说
btnContinue
)并将其注入控制器

@Inject Button btnContinue;
将按钮可见性属性绑定到
isGameRunning
属性。(在初始化方法中执行此操作)


现在,无论何时更改isGameRunning的值,按钮的可见性都将更改。

创建布尔属性:

BooleanProperty isGameRunning = new SimpleBooleanProperty(false);
给你的“继续”按钮一个fx:id(比如说
btnContinue
)并将其注入控制器

@Inject Button btnContinue;
将按钮可见性属性绑定到
isGameRunning
属性。(在初始化方法中执行此操作)


现在,无论何时更改isGameRunning的值,按钮的可见性都会改变。

正如haisi所描绘的,缺少的链接是扩展Initialize()方法,以创建一个属性绑定,该绑定从yout gameRunning boolean(属性)到按钮的visibleProperty()

FXML:


我曾期望,将gameRunning实现为完整的JavaFXbean属性(setGameRunning、getGameRunning、gameRunningProperty)就足够了,visible=“${gameRunning}”将自动运行,但无法正确实现。正如haisi所描述的,缺少的链接是扩展Initialize()方法,以创建从yout Game Running boolean(property)到按钮visibleProperty()的属性绑定:

FXML:


我曾期望,将gameRunning实现为完整的JavaFXbean属性(setGameRunning、getGameRunning、gameRunningProperty)就足够了,visible=“${gameRunning}”将自动运行,但无法正确实现。已经在中讨论过:

我是否理解正确:您的代码提供了一个BooleanProperty,如果游戏正在运行,并且BooleanProperty gameRunning()方法返回该属性,该属性将为true?或者是否需要轮询getGameRunning()方法以获取运行状态?您可能对的答案中使用的技术感兴趣,其中讨论了基于条件操纵可见性(在这种情况下,它是基于角色的条件,因此不完全适用于您的情况,但理解起来可能仍然有用)。我是否理解正确:您的代码提供了一个BooleanProperty,如果游戏正在运行,并且方法BooleanProperty gameRunning()返回该属性,则该属性将为true?或者是否需要轮询getGameRunning()方法以获取运行状态?您可能对的答案中使用的技术感兴趣,该答案讨论了基于条件的操纵可见性(在这种情况下,它是基于角色的条件,因此不完全适用于您的情况,但理解起来可能仍然有用)。
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <padding><Insets top="25" right="25" bottom="25" left="25"/></padding>

    <Text id="welcome-text" text="Main Menu" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="2"/>
    <Button text="New" onAction="#handleNew" GridPane.rowIndex="1"/>
    <Button fx:id="continueBtn" text="Continue" onAction="#handleContinue" GridPane.rowIndex="2" />
    <Button text="Load" onAction="#handleLoad" GridPane.rowIndex="3"/>
    <Button text="Save" onAction="#handleSave" GridPane.rowIndex="4"/>
    <Button text="Quit" onAction="#handleQuit" GridPane.rowIndex="5"/>
</GridPane>
public class GameController implements Initializable {
    private BooleanProperty gameRunning = new SimpleBooleanProperty(false);

    @FXML Button continueBtn;

    @FXML protected void handleNew(ActionEvent event) {
        gameRunning.set(true);
    }
    @FXML protected void handleLoad(ActionEvent event) {

    }
    @FXML protected void handleSave(ActionEvent event) {

    }
    @FXML protected void handleQuit(ActionEvent event) {
        gameRunning.set(false);
    }
    @FXML protected void handleContinue(ActionEvent event) {
        System.out.println("Continue!");
        //parent.handle(new GUIEvent(GUIEvent.Type.CONTINUE));
    }
    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        continueBtn.visibleProperty().bind(gameRunning);  
    }
}