гриффон javafx-groovy и fxml?

Я попробовал образцы, приведенные в github griffon-master, а также образцы из руководства.

Я хотел бы использовать javafx и groovy.

Я хотел бы использовать fxml - подумал о сценарии так: fxml для подготовки сцены, а для изменений используйте groovy (установить настройку)

Кажется, что это невозможно. Я могу использовать («запустить»): javafx-java, прочитать fxml (с loadFromFXML), и привязки работают. При использовании javafx-groovy я могу прочитать fxml, но с загрузчиком javafx-класса (загрузить) и привязки не работают (или так кажется).

Разве в данный момент нельзя использовать javafx-groovy и fxml для чтения (через loadfromfxml)?


person Will    schedule 13.03.2015    source источник


Ответы (2)


Не могли бы вы опубликовать пример кода? Вот один пример, в котором используется форма узла fxml GroovyFX.

package org.example

import griffon.core.artifact.GriffonView
import griffon.metadata.ArtifactProviderFor
import javafx.scene.control.Tab
import org.codehaus.griffon.runtime.javafx.artifact.AbstractJavaFXGriffonView

@ArtifactProviderFor(GriffonView)
class Tab4View extends AbstractJavaFXGriffonView {
    FactoryBuilderSupport builder
    SampleController controller
    SampleModel model
    private AppView parentView

    void initUI() {
        builder.with {
            content = builder.fxml(resource('/org/example/tab4.fxml')) {
                inputLabel.text = application.messageSource.getMessage('name.label')
                bean(input, text: bind(model.inputProperty()))
                bean(output, text: bind(model.outputProperty()))
            }
        }

        connectActions(builder.content, controller)

        Tab tab = new Tab('Hybrid')
        tab.content = builder.content
        parentView.tabPane.tabs.add(tab)
    }
}
person Andres Almiray    schedule 14.03.2015
comment
Мы только что выпустили новый учебник, в котором объясняются различные варианты создания представлений JavaFX new.griffon-framework .org/tutorials/4_javafx_views.html - person Andres Almiray; 15.03.2015

Это можно сделать. Хитрость заключается в том, чтобы действия контроллера соответствовали строгому набору правил. TLDR должен убедиться, что они возвращают void.

Хорошо:

    def void save() {

Плохой:

    def save() {

Причина кроется в рефлексивном анализе, который инфраструктура Griffon использует для создания своего списка целей действий. Этот список создается в DefaultGriffonControllerClass.getActionNames(), для чего необходимо:

Действия подчиняются следующим правилам, чтобы считаться таковыми:

  • должен иметь общедоступный (Java) или модификатор видимости по умолчанию (Groovy).
  • name не соответствует обработчику события, т. е. не начинается с on.
  • должен передать {code GriffonClassUtils.isPlainMethod()}, если это метод.
  • должен иметь тип возвращаемого значения void, если это метод.
  • value должно быть замыканием (включая каррированные указатели на методы), если оно является свойством.

Критерии, определенные в GriffonClassUtils.isPlainMethod() следующие:

  • isInstanceMethod(method)
  • ! isBasicMethod(method)
  • ! isGroovyInjectedMethod(method)
  • ! isThreadingMethod(method)
  • ! isArtifactMethod(method)
  • ! isMvcMethod(method)
  • ! isServiceMethod(method)
  • ! isEventPublisherMethod(method)
  • ! isObservableMethod(method)
  • ! isResourceHandlerMethod(method)
  • ! isGetterMethod(method)
  • ! isSetterMethod(method)
  • ! isContributionMethod(method)

Список имен целей действий впоследствии используется AbstractActionManager:

@Nullable
private static Method findActionAsMethod(@Nonnull GriffonController controller, @Nonnull String actionName) {
    for (Method method : controller.getClass().getMethods()) {
        if (actionName.equals(method.getName()) &&
            isPublic(method.getModifiers()) &&
            !isStatic(method.getModifiers()) &&
            method.getReturnType() == Void.TYPE) {
            return method;
        }
    }
    return null;
}
person MTippetts    schedule 21.03.2016