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);
}
Другие вопросы по тегам