2013-11-18 4 views
1

Настоящий новичок на сцену 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 (ничего не жаловался ни на выходе был «фокус получил». В моем отладчике я вижу ссылку на контроллер ... но на данный момент, я в кроличью нору и уверены в неправильной реализации ...

Может кто-то пожалуйста, помогите мне?

Спасибо!

+0

Ваш последний пример должен работать, если вы выполняете действие вместо создания ClosureMethod из него. Синтаксический объект. MethodName используется для создания Closure, поэтому вы не вызываете действие. – aalmiray

ответ

1

Хорошо - после того, как поменять место (и хороший пробег). Это довольно легко.

В представлении я добавил слушателя к focusProperty текстового поля. Этот слушатель ссылается в модели таким образом:

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') 
     } 
    } 

} 

Что делает общий смысл для меня в модели, как у меня есть все доступ Мне нужно манипулировать моим взглядом. Во всяком случае, я надеюсь, что это поможет кому-то еще в этом нуждается.