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
}
}
}
});
没有任何抱怨,但我的控制器方法从未被激活(没有任何抱怨,输出是'焦点获得'。在我的调试器中我确实看到了对控制器的引用......但是在这一点上,我是在兔子洞里并确定实施不正确......
有人可以帮助我吗?
谢谢!
答案 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')
}
}
}
这对我来说在模型中是完全合理的,因为我拥有操纵视图所需的所有访问权限。无论如何,我希望这可以帮助其他有需要的人。