Griffon groovyfx控制器访问

时间:2013-11-18 18:49:43

标签: javafx griffon groovyfx

JavaFX场景的真正新手,所以这里。

griffon 1.4.0 - jdk 1.7.0_45

griffon插件(groovyfx-0.9.1,javafx-0.10.0)

我正在尝试为我的一个文本字段实现一个简单的焦点监听器。我的想法是,一旦文本域被聚焦,我想在同一视图中更改标签的消息。我确信答案很简单,但我认为我已经完成了复杂的事情。

对于整体上下文,我试图通过读取fxml并使用groovy视图进行绑定等来实现我的视图。

application(title: 'Myapp', sizeToScene: true, resizable: false, centerOnScreen: true) {
scene(fill: WHITE) {
    fxml(app.getResourceAsURL('fxtemplates/login.fxml').text) {
         // my bindings and onActions ( which are working great ) go in here
}

看看groovyfx文档,似乎没有像onAction那样的onFocus方法,所以我必须为focusedProperty添加一个监听器 - 非常没有汗水。我首先尝试为ChangeListener编写一个闭包:

aTextField.focusedProperty().addListener({ obsVal, oldVal, newVal ->
       // do something...    
})

但是Uberbuilder抱怨并且我显然做错了(在这方面轻推会有所帮助)

所以我编写了一个空的FocusListener类,它实现了一个ChangeListener,然后在我的视图中绑定它。

class FocusListener implements ChangeListener<Boolean> {

@Override
public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
    // for the view to override...
}

}

然后在我看来

aTextField.focusedProperty().addListener(new FocusListener () {

            @Override
            public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
                if(newVal != null && newVal == Boolean.TRUE) {
                    execInsideUIAsync {
                    println 'focus gained'

                    }
                }
            }

        });

代码执行得很好(焦点获得的打印)但当然我在范围内,所以我无法访问我的控制器或查看组件。对于咧嘴笑(不是真的喜欢它但尝试出来)我将我的控制器传递给我的FocusListener的构造函数并在我的控制器上调用了一个方法。

class FocusListener implements ChangeListener<Boolean> {

def controller

public FocusListener(controller) {
    this.controller = controller
}

@Override
public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
    // for the view to override...
}

}

然后在我看来

aTextField.focusedProperty().addListener(new FocusListener (controller) {

            @Override
            public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
                if(newVal != null && newVal == Boolean.TRUE) {
                    println "Gained Focus"
                    execInsideUIAsync {
                       println 'focus gained'
                        controller.&clearMessages
                    }
                }
            }

        });

没有任何抱怨,但我的控制器方法从未被激活(没有任何抱怨,输出是'焦点获得'。在我的调试器中我确实看到了对控制器的引用......但是在这一点上,我是在兔子洞里并确定实施不正确......

有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

好的 - 所以经过更多的修修补补(并且运行良好)。这很容易。

在视图中,我向textfield的focusedProperty添加了一个监听器。该模型中引用了该侦听器:

aTextField.focusedProperty().addListener(model.fieldFocusListener)

然后在模型中我实现对已绑定值的更改

@FXBindable String field_one
@FXBindable String field_two
@FXBindable String message

//...

ChangeListener fieldFocusListener

void mvcGroupInit(Map args) {

    fieldFocusListener = new ChangeListener() {
        @Override
        void changed(ObservableValue observableValue, Object t, Object t1) {
           this.setMessage('your message here')
        }
    }

}

这对我来说在模型中是完全合理的,因为我拥有操纵视图所需的所有访问权限。无论如何,我希望这可以帮助其他有需要的人。