如何在JavaFX中将可见性绑定到控制器
我正在尝试使用JavaFX为我的游戏创建一个菜单。我想有一个“继续”按钮,我只想在游戏运行时看到它。我试图将按钮的可见性属性绑定到控制器,但它似乎不起作用-按钮只是不可见 我环顾了Google和StackExchange,找到了有关如何以编程方式设置它的信息,但我不希望Java代码与FXML的耦合比我真正需要的更紧密 这是我的FXML页面代码如何在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.
<?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);
}
}