真正的新手到JavaFX现场,所以,这里。
格里丰1.4.0-JDK 1.7.0_45
griffon插件( groovyfx-0.9.1,javafx-0.10.0)
我正在尝试为我的一个文本字段实现一个简单的焦点侦听器。这个想法是,一旦textfield被聚焦,我想在同一个视图中更改标签的消息。我相信答案很简单,但我想我已经谈过一些复杂的问题了。
对于整个上下文,我试图通过阅读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文档来看,似乎没有像onFocus那样的onAction方法,所以我不得不在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'
}
}
}
});代码执行得很好(焦点获得了打印),但是当然我在范围内,所以我无法访问我的控制器或视图组件。对于grins (不太喜欢它,而是尝试它),我把控制器传递给了我的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
}
}
}
});没有什么抱怨,但我的控制器方法从来没有执行(也没有抱怨,输出是‘焦点增加’。在我的调试器中,我确实看到了对控制器的引用.但在这一点上,我已经走投无路了,而且肯定是不正确的.
有人能帮帮我吗?
谢谢!
发布于 2013-11-18 23:40:31
好吧这相当简单。
在视图中,我向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')
}
}
}这在我的模型中是完全有意义的,因为我拥有操作我的观点所需的所有访问权限。不管怎样,我希望这能帮助到其他需要帮助的人。
https://stackoverflow.com/questions/20055461
复制相似问题