我尝试了github griffon-master中给出的样本,也尝试了指南的样本。
我想使用 javafx 和 groovy。
我想使用 fxml - 想到一个场景:fxml 设置舞台,对于更改,使用 groovy (设置调整)
这似乎是不可能的。我可以使用("让它运行"):javafx-java,读取一个fxml(使用loadFromFXML),并且绑定正在工作。如果使用javafx-groovy,我可以读取fxml,但是使用javafx类加载器(加载),并且绑定不起作用(或者看起来是这样)。
目前是否无法使用javafx-groovy和read-in fxml(通过loadfromfxml)?
你能发布一些示例代码吗?下面是一个利用 GroovyFX 形式的fxml
节点的示例
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)
}
}
这是可以做到的。诀窍是使您的控制器操作遵守一组严格的规则。TLDR是为了确保它们返回无效。
好:
def void save() {
坏:
def save() {
原因在Griffon框架用于创建其行动目标列表的反射分析中找到。此列表在 DefaultGriffonControllerClass.getActionNames()
中生成,这需要:
行动受以下规则的约束,以便被视为此类规则:
- 必须具有公共 (Java) 或默认 (Groovy) 可见性修饰符。
- 名称与事件处理程序不匹配,即它不以 on 开头。
- 如果是方法,则必须通过
{code GriffonClassUtils.isPlainMethod()}
。- 如果是方法,则必须将 void 作为返回类型。
- 值必须是闭包(包括柯里方法指针),如果它是一个属性。
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;
}