2014-11-20 5 views
0

Я пытаюсь создать меню для своей игры с помощью JavaFX. Я хочу иметь кнопку «Продолжить», которую я хочу видеть только во время игры. Я пытаюсь связать свойство видимости кнопки с контроллером, но он не работает, кнопка просто невидима.Как связать видимость с контроллером в 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> 

Вот мой код контроллера (подстриженной несколько):

@FXML protected void handleContinue(ActionEvent event) { 
    System.out.println("Continue!"); 
    parent.handle(new GUIEvent(GUIEvent.Type.CONTINUE)); 
} 
// ... 
@FXML protected boolean getGameRunning() { 
    System.out.println("Test!"); 
    // Some check to see if there's a game in progress... 
    return true; 
} 

Любая идея, что я делаю неправильно? Мой код компилируется, и все кнопки, кроме «Продолжить», видны и работают.

+0

Правильно ли я понимаю: код содержит BooleanProperty, который будет истинным, если игра запущена, и метод BooleanProperty gameRunning() возвращает это свойство? Или метод getGameRunning() должен быть опрошен для получения статуса выполнения? –

+0

Вам могут быть интересны методы, используемые в ответе на [Есть ли способ реализовать свойство «rendered» на JAVAFX?] (Http://stackoverflow.com/questions/19666982/is-there-a-way -to-implementation-a-property-like-rendered-on-javafx), в котором обсуждается манипулирование видимостью на основе условий (в этом случае это основанные на ролях условия, поэтому не совсем применимы к вашей ситуации, но, вероятно, полезно понять). – jewelsea

ответ

1

Как набросал по haisi, недостающим звеном является расширение метода Initialize(), чтобы создать свойство связывания с Yout gameRunning булевой (собственности) на visibleProperty() кнопки:

FXML:

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); 
    } 
} 

Я имел ожидание, что оно должно быть достаточно для реализации gameRunning в полной JavaFX свойства компонента (setGameRunning, getGameRu nning, gameRunningProperty), а видимый = «$ {gameRunning}» должен работать автоматически, но не смог добиться этого правильно. Это обсуждалось в: Binding a Label's text property (in an FXML file) to an IntegerProperty (in a controller)

2

Создать BooleanProperty:

BooleanProperty isGameRunning = new SimpleBooleanProperty(false); 

Дайте «кнопки continue' конверсионной: идентификатор (позволяет сказать btnContinue) и ввести его в контроллер.

@Inject Button btnContinue; 

Свяжите кнопки видимость свойство вашего isGameRunning собственности. (Делайте это в методе инициализации)

btnContinue.visibleProperty().bind(isGameRunning); 

Теперь, когда вы измените значение isGameRunning, видимость вашей кнопки изменится.

Смежные вопросы