3

I'm trying to combine CDI (weld-se 2) and JavaFX and I want to annotate my controller class with custom created annotation so this class creation is managed using my factory method. I suppose that is should looks like below but this code is not working. Could you possibly advice what should be changed?

Annotation:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE })
@Qualifier
public @interface FXMLManaged {
}

Factory class:

public class FXMLManagedProducer {
    @Produces @FXMLManaged
    public <T> T getFXMLManagedInstance(Class<T> type) {
        return type.newInstance();
    }
}

Controller class:

@FXMLManaged
public class NewsListView {
}
4

2 回答 2

5

您似乎将 CDI Extensions 与生产者混合在一起。首先,如果你想要一个生产者,工厂方法应该返回 a NewsListView,而不是泛型类型。与限定符注释一起使用@Producer将与带注释的类型绑定。所以没有必要用NewsListView注释@FXMLManaged。然后你将你的NewsListView某个地方注入到一个 bean 中。

生成视图:

public class FXMLManagedProducer {
    @Produces @FXMLManaged
    public NewsListView getFXMLManagedInstance() {
        return new NewsListView();
    }
}

使用生产者:

public class SomeBean {
    @Inject @FXMLManaged
    NewsListView view;
}

但我的猜测是,这不是你要找的。我想你可能想创建一个CDI 扩展

public class YourExtension implements Extension {

    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
        if(pat.getAnnotatedType().isAnnotationPresent(FXMLManaged.class)) {
            // do your stuff here
        }
    } 
}

这样您就可以处理带注释的NewsListView. 您可能想看看其他方法来挂钩生命周期,因此您可以创建 bean 并在必要时注入依赖项。

于 2013-08-06T09:49:25.373 回答
1

首先,您需要创建一个 Weld-Container 才能使用 CDI。这里有些例子:

http://java.dzone.com/articles/fxml-javafx-powered-cdi-jboss http://blog.matthieu.brouillard.fr/2012/08/fxml-javafx-powered-by-cdi-jboss-weld_6 .html

有一个正在开发中的用于 JavaFX 的 CDI API。它将成为 DataFX 的一部分。你可以在这里找到一些新闻:

http://www.guigarage.com/2013/05/designing-javafx-business-applications-part-2/

于 2013-08-06T11:16:45.713 回答