Как заставить JavaFX отображать фид API - PullRequest
0 голосов
/ 02 октября 2018

Мой вопрос довольно прост (я просто развлекательный кодер, играющий с вещами).Я установил соединение с API, и с помощью магии RxJava я могу подписаться на данные json, передаваемые API.Я также создал очень простой графический интерфейс с использованием FXML.

Как сделать так, чтобы текст в TextArea = textAreaA обновлялся каждый раз, когда событие отправляется по подписке?Иными словами, как мне заставить TextArea отображать канал API?

Я прочитал руководство RxJavaFx от обложки до обложки, и оно, кажется, больше фокусируется на направленном потоке событий от Fx к Rx: (

Вот пример моего кода:

    public class Tester extends Application{

    private static final Logger LOG = LoggerFactory.getLogger(Tester.class);

    public static void main(String[] args) throws IOException, InterruptedException{

        launch(args);

    }

    public void start (Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        Parent root = loader.load();

        primaryStage.setTitle("App Window");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();


        TESTER_API.TESTER_API_Connector();       


    }

}

    public class TESTER_API {

    public static void TESTER_API_Connector() throws IOException, InterruptedException {
        StreamingEvents emissions = StreamingEventsFactory.INSTANCE.createEvents(TheseStreamingEvents.class.getName());     
        emissions.connect().blockingAwait();
        emissions.getEvents().getSomethingSpecific()
        .subscribe(event -> System.out.println(event.getSomethingSpecific()) // Here is the event that I would like to bind or otherwise push to textAreaA in the FXML controller
        ,throwable -> new Exception("GUI error!"));

    }
}

    public class FXMLDocumentController implements Initializable {

    @FXML 
    public TextArea textAreaA;

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        // TODO Auto-generated method stub

    }


}

1 Ответ

0 голосов
/ 02 октября 2018

Моя идея состояла в том, чтобы TESTER_API вызвать функцию в FXMLDocumentController, которая обновляет textAreaA.Я бы рекомендовал использовать Platform.runLater() для обеспечения безопасности потоков.

public class Tester extends Application{
[...]

public void start (Stage primaryStage) throws Exception {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
    Parent root = loader.load();

    FXMLDocumentController controller = loader.getController();

    primaryStage.setTitle("App Window");
    primaryStage.setScene(new Scene(root, 300, 275));
    primaryStage.show();


    TESTER_API.TESTER_API_Connector(controller);       
}

}

public class TESTER_API {

public static void TESTER_API_Connector(FXMLDocumentController controller) throws IOException, InterruptedException {
    [...]
    emissions.getEvents().getSomethingSpecific()
    .subscribe(event -> Platform.runLater(() -> {
        controller.updateTextArea(event.getSomethingSpecific());
    }),
    throwable -> new Exception("GUI error!"));

}

}

public class FXMLDocumentController implements Initializable {

    @FXML 
    public TextArea textAreaA;

    [...]
    public void updateTextArea(String string) {
        textAreaA.setText(string);
    }
}
...