Настоящий новичок на сцену JavaFX, поэтому здесь идет.Доступ к контроллеру Griffon groovyfx
грифон 1.4.0 - JDK 1.7.0_45
грифон плагинов (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 документы там не кажется, метод 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'
}
}
}
});
Кода выполняется нормально (фокус получил отпечатки), но, конечно, я падаю в рамках, так что я не имею доступ к моему контроллеру или просмотреть компоненты , Для усмешек (на самом деле это не понравилось, но попробовал) я передал свой контроллер конструктору моего 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
}
}
}
});
Ничто не жаловался, но мой метод контроллера никогда не exectued (ничего не жаловался ни на выходе был «фокус получил». В моем отладчике я вижу ссылку на контроллер ... но на данный момент, я в кроличью нору и уверены в неправильной реализации ...
Может кто-то пожалуйста, помогите мне?
Спасибо!
Ваш последний пример должен работать, если вы выполняете действие вместо создания ClosureMethod из него. Синтаксический объект. MethodName используется для создания Closure, поэтому вы не вызываете действие. – aalmiray