首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Griffon groovyfx控制器访问

Griffon groovyfx控制器访问
EN

Stack Overflow用户
提问于 2013-11-18 18:49:42
回答 1查看 437关注 0票数 1

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

格里丰1.4.0-JDK 1.7.0_45

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

我正在尝试为我的一个文本字段实现一个简单的焦点侦听器。这个想法是,一旦textfield被聚焦,我想在同一个视图中更改标签的消息。我相信答案很简单,但我想我已经谈过一些复杂的问题了。

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

代码语言:javascript
复制
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文档来看,似乎没有像onFocus那样的onAction方法,所以我不得不在focusedProperty中添加一个侦听器--没什么大不了的。我首先尝试为ChangeListener编写一个闭包:

代码语言:javascript
复制
aTextField.focusedProperty().addListener({ obsVal, oldVal, newVal ->
       // do something...    
})

但是Uberbuilder抱怨说,我显然做错了(朝这个方向轻轻推一下就会有帮助)

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

代码语言:javascript
复制
class FocusListener implements ChangeListener<Boolean> {

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

}

在我看来

代码语言:javascript
复制
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'

                    }
                }
            }

        });

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

代码语言:javascript
复制
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...
}

}

然后在我看来

代码语言:javascript
复制
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
                    }
                }
            }

        });

没有什么抱怨,但我的控制器方法从来没有执行(也没有抱怨,输出是‘焦点增加’。在我的调试器中,我确实看到了对控制器的引用.但在这一点上,我已经走投无路了,而且肯定是不正确的.

有人能帮帮我吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-18 23:40:31

好吧这相当简单。

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

代码语言:javascript
复制
aTextField.focusedProperty().addListener(model.fieldFocusListener)

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

代码语言:javascript
复制
@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')
        }
    }

}

这在我的模型中是完全有意义的,因为我拥有操作我的观点所需的所有访问权限。不管怎样,我希望这能帮助到其他需要帮助的人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20055461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档