我正在关注本教程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);
}
}