【问题标题】:griffon javafx-groovy and fxml?griffon javafx-groovy 和 fxml?
【发布时间】:2015-03-13 08:03:47
【问题描述】:

我尝试了 github griffon-master 中给出的示例,也尝试了指南的示例。

我想使用 javafx 和 groovy。

我想使用 fxml - 想到一个场景:fxml 设置舞台,并且对于更改,使用 groovy(设置调整)

这似乎是不可能的。我可以使用(“让它运行”):javafx-java,读取一个 fxml(使用 loadFromFXML),并且绑定正在工作。如果使用 javafx-groovy,我可以读取 fxml,但是使用 javafx-class Loader(加载),并且绑定不起作用(或者看起来如此)。

现在不能使用javafx-groovy和读入fxml(通过loadfromfxml)吗?

【问题讨论】:

    标签: groovy griffon fxmlloader


    【解决方案1】:

    您能发布一些示例代码吗?这是一个使用 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)
        }
    }
    

    【讨论】:

    【解决方案2】:

    这是可以做到的。诀窍是让您的控制器操作遵守一组严格的规则。 tldr 是为了确保它们返回 void。

    好:

        def void save() {
    

    不好:

        def save() {
    

    原因在于 Griffon 框架用于创建其行动目标列表的反思分析。此列表在DefaultGriffonControllerClass.getActionNames() 中生成,要求:

    操作须遵守以下规则才能被视为:

    • 必须具有公共 (Java) 或默认 (Groovy) 可见性修饰符。
    • 名称与事件处理程序不匹配,即它不以 on 开头。
    • 如果是方法,则必须通过{code GriffonClassUtils.isPlainMethod()}
    • 如果是方法,则返回类型必须为 void。
    • value 必须是一个闭包(包括 curried 方法指针),如果它是一个属性。

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多