Griffon-JavaFX: View бросает NPE относительно модели

Я совершаю набег на мир грифонов, и у меня есть небольшое приложение для ленивых, которое я скачал, которое выдает ошибки. Мой взгляд выглядит так.

@ArtifactProviderFor(GriffonView)
class PennyPackerView {
FactoryBuilderSupport builder
PennyPackerController controller
PennyPackerModel model

void initUI() {
    builder.application(title: application.configuration['application.title'],
        sizeToScene: true, centerOnScreen: true, name: 'mainWindow') {
        scene(fill: WHITE, width: 200, height: 60) {
            gridPane {
                label(id: 'clickLabel', row: 0, column: 0,
                      text: bind(model.clickCount))
                button(row: 1, column: 0, prefWidth: 200,
                        controller.click())
            }
        }
    }
}

}

После использования gradle:run выдается ошибка, из-за которой я полагаю, что моя модель не внедряется, по крайней мере, во время привязки.

Warning, could not locate neither a JavaFX property nor a JavaBean property for class         
javafx.scene.control.Label, property: '0'
[2014-10-20 13:30:56,166] [JavaFX Application Thread] 
  ERROR griffon.core.GriffonExceptionHandler      
  - Uncaught Exception
 java.lang.NullPointerException: Cannot bind to null
at javafx.beans.property.StringPropertyBase.bind(StringPropertyBase.java:161)
at javafx.beans.property.Property$bind.call(Unknown Source)
at groovyx.javafx.factory.FXHelper$__clinit__closure26.doCall(FXHelper.groovy:454)

Ниже приведен код модели, который не очень сложен.

@ArtifactProviderFor(GriffonModel)
class PennyPackerModel {
    @FXObservable String clickCount = "0"
}

Любая помощь в том, почему этот NPE выбрасывается или по любым другим вопросам, очень ценится. Я считаю, что то, что я получил от lazybones, было стартовым приложением griffon-javafx-groovy.

РЕДАКТИРОВАТЬ: Итак, я отлаживал, похоже, что модель вводится, но что-то идет не так при настройке привязки. В классе StringPropertyBase значение переданного ему newObservable равно null.

    public void bind(ObservableValue<? extends String> newObservable) {
    if (newObservable == null) {
        throw new NullPointerException("Cannot bind to null");
    }

Я не знаю, почему это происходит и как это исправить =(


person Black Dynamite    schedule 20.10.2014    source источник


Ответы (1)


Проблема в следующей строке

text: bind(model.clickCount))

Так должно быть

text: bind(model.clickCountProperty))

Первый возвращает простое значение, а второй возвращает свойство JavaFX. Я удивлен, что вы обнаружили эту проблему, так как быстрый поиск источников дает следующее

$ grep clickCount -r griffon-javafx-* | grep bind
griffon-javafx-groovy-templates/templates/griffon-javafx-groovy/griffon-app/views/View.groovy:                          text: bind(model.clickCountProperty()))
griffon-javafx-groovy-templates/templates/subtmpl-artifact/View.groovy:                          text: bind(model.clickCountProperty()))
griffon-javafx-java-templates/templates/griffon-javafx-java/griffon-app/views/View.java:        model.clickCountProperty().bindBidirectional(clickLabel.textProperty());
griffon-javafx-java-templates/templates/subtmpl-artifact/View.java:        model.clickCountProperty().bindBidirectional(clickLabel.textProperty());
person Andres Almiray    schedule 22.10.2014