Weld + CDI + JAVA-FX(射击活动)

时间:2015-06-01 16:03:36

标签: javafx cdi weld

我正在关注本教程http://java.dzone.com/articles/fxml-javafx-powered-cdi-jboss,因为@Inject与JavaFX完美配合。我想充分利用CDI-Weld使用CDI事件并将@Observers放在控制器方法中,这样我就可以从模型中触发事件来操纵控制器而不需要耦合:

Quesion就是这个: 正确触发CDI事件并且有效负载到达目的地,但是当我需要在事件Method中使用它们时,所有@ FXML对象都为空。就像,我正在观察@FXML注入初始化字段的其他地方。

如果开发便携式扩展程序或者有更简单的方法,我不知道在哪里投入我的努力?

package com.codexven.weldtest.javafx;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.application.Application.Parameters;
import javafx.event.ActionEvent;
import javafx.fxml.*;
import javafx.scene.control.*;
import javafx.scene.text.Text;
import javax.enterprise.event.Observes;

import javax.inject.Inject;

`public class LoginController implements Initializable {
    // Standard FXML injected fields
    @FXML TextField loginField;
    @FXML PasswordField passwordField;
    @FXML Text feedback;

    @Inject SimpleLoginService loginService;

    @Inject Parameters applicationParameters;

    @FXML protected void handleSubmitButtonAction(ActionEvent event) {
        feedback.setText(loginService.login(loginField.getText(), passwordField.getText()));
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
            System.out.println("ls "+loginService);
        loginField.setText(applicationParameters.getNamed().get("user"));
    }

        public void eventTest(@Observes SimpleLoginService service){
            System.out.println("ls "+loginService);
        loginField.setText("Hello Event");
    }
}

在SimpleLoginService中:

package com.codexven.weldtest.javafx;

import com.codexven.weldtest.weld.LoggedIn;
import javax.enterprise.event.Event;
import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Inject;

public class SimpleLoginService implements LoginService {

        @Inject
    @LoggedIn
    Event<SimpleLoginService> authenticateEvent;


    @Override
    public String login(String login, String password) {
        if (password != null && password.trim().length() > 0) {

                authenticateEvent.select(new AnnotationLiteral<LoggedIn>(){}).fire(this);
            return String.format("%1$s logged in successfully", login);
        }
                authenticateEvent.select(new AnnotationLiteral<LoggedIn>(){}).fire(this);
        return String.format("%1$s failed to login", login);
    }
}

0 个答案:

没有答案