JavaFX Gluon выполняет контроллер из поля зрения
Я разрабатываю мобильные приложения, используя javafx gluon и GCM для обмена сообщениями
когда другое устройство передает сообщение, я хочу обновить текущее активное представление входящим сообщением, вызвав его контроллер.
Я использую фреймворк Afterburner. это также описано в начале глюона
Как получить контроллер представления из getView() в классе, расширяющем MobileApplication?
вот классы, которые я создал:
public class MyGCMListenerService extends GcmListenerService {
private final String NOTIFICATION_TAG = "NotificationExample";
public MyGCMListenerService() {
}
@Override
public void onMessageReceived(String from, Bundle data) {
String varMessage = data.getString("message");
try {
JSONObject json = new JSONObject(varMessage);
String messageContent = getStringFromJSON(json, "message");
Integer senderId = getIntegerFromJSON(json, "senderId");
String senderName = getStringFromJSON(json, "senderName");
String comId = getStringFromJSON(json, "communityId");
SKSApplication.getInstance().doRefreshMessageUI(messageContent,senderId,senderName,comId );
} catch (JSONException e) {
e.printStackTrace();
}
}}
XML-файл макета (directmessage.fxml)
<View xmlns:fx="http://javafx.com/fxml/1" fx:id="directMessageView" prefHeight="600.0" prefWidth="400.0"
xmlns="http://javafx.com/javafx/8.0.40"
fx:controller="com.tenma.mobile.message.directmessage.DirectMessagePresenter">
</View>
Класс DirectMessageView расширяет FXMLView
public class DirectMessageView extends FXMLView {
}
Класс DirectMessagePresenter реализует Initializable
public class DirectMessagePresenter implements Initializable{
public void displayIncomingMessage(String messageContent,Integer senderId,String senderName, String comId){
//save to internal db
// display message
}
}
Класс SKSAplication, расширяющий MobileAplication
public class SKSApplication extends MobileApplication{
private static SKSApplication instance;
public static final String DIRECT_MESSAGE_VIEW = "DIRECT_MESSAGE_VIEW";
public static final String GROUP_MESSAGE_VIEW = "GROUP_MESSAGE_VIEW";
public SKSApplication() {
instance = this;
}
public static SKSApplication getInstance() {
return instance;
}
addViewFactory(HOME_VIEW, () -> {
HomeView homeView = new HomeView();
homePresenter = (HomePresenter) homeView.getPresenter();
return (View) homeView.getView();
});
addViewFactory(DIRECT_MESSAGE_VIEW, () -> {
DirectMessageView directMessageView = new DirectMessageView();
return (View) directMessageView.getView();
});
addViewFactory(GROUP_MESSAGE_VIEW, () -> {
GroupMessageView groupMessageView = new GroupMessageView();
return (View) groupMessageView.getView();
});
public void doRefreshMessageUI(String messageContent,Integer senderId,String senderName, String comId ) {
if (DIRECT_MESSAGE_VIEW.equals(getView().getName())) {
здесь я пытаюсь получить прямой просмотр сообщения из getView() внутри метода doRefreshMessageUI, но это не работает
DirectMessageView view = (DirectMessageView) getView();
DirectMessagePresenter presenter = (DirectMessagePresenter) view.getPresenter();
presenter.displayIncomingMessage(messageContent,senderId,senderName,comId);
}
}
}
заранее спасибо
1 ответ
Вы можете получить презентатора представления после создания представления:
private DirectMessagePresenter presenter;
@Override
public void init() {
addViewFactory(HOME_VIEW, () -> {
HomeView homeView = new HomeView();
homePresenter = (HomePresenter) homeView.getPresenter();
return (View) homeView.getView();
});
addViewFactory(DIRECT_MESSAGE_VIEW, () -> {
DirectMessageView directMessageView = new DirectMessageView();
presenter = (DirectMessagePresenter) directMessageView.getPresenter();
return (View) directMessageView.getView();
});
}
Это будет работать независимо от того, какой текущий вид вы показываете.
Позже, когда вы захотите передать некоторые новые значения, вы можете использовать свой метод вместе с ним:
public void doRefreshMessageUI(String messageContent,Integer senderId,String senderName, String comId ) {
presenter.displayIncomingMessage(messageContent,senderId,senderName,comId);
}
Предполагая, что на этом докладчике у вас есть элементы управления для отображения новых значений, вам просто нужно установить их там:
public void displayIncomingMessage(String messageContent, Integer senderId, String senderName, String comId){
labelContent.setText(messageContent);
labelSenderId.setText(senderId.toString());
labelName.setText(senderName);
labelComId.setText(comId);
}
Также вы можете использовать свойства JavaFX:
private final StringProperty content = new SimpleStringProperty();
private final IntegerProperty senderId = new SimpleIntegerProperty();
private final StringProperty name = new SimpleStringProperty();
private final StringProperty comId = new SimpleStringProperty();
@Override
public void initialize(URL url, ResourceBundle rb) {
labelContent.textProperty().bind(content);
labelSenderId.textProperty().bind(senderId.asString());
labelName.textProperty().bind(name);
labelComId.textProperty().bind(comId);
}
public void displayIncomingMessage(String messageContent, Integer senderId, String senderName, String comId){
this.content.set(messageContent);
this.senderId.set(senderId);
this.name.set(senderName);
this.comId.set(comId);
}