Spring +JavaFX TextArea nie jest aktualizowana

0

Mam problem z aktualizacja zawartosci TextArea.
Gdy wykonuje operacje na bazie danych, ktore sa dosc czasochlonne, wyswietlam sobie okno postępu pracy. Z kazdym krokiem, chcialabym wyswietlac dodatkowy wpis w text area. Niestety, textArea nie aktualizuje sie. Dopiero gdy Servis zakonczy swoja prace, wszystkie notyfikacje jakie byly wysylane pojawiaja sie na ekranie.

Probowalam kombinowac z Eventami, niestety nie działa.

FXMLController
public class TestProgressNotificationsView extends ViewFX<AnchorPane> {

    private final AnchorPane root = new AnchorPane();
    private final Label title = new Label();

(...)
    @EventListener
    public void progressUpdate(BenchmarkProgressEvent event) {
            notificationArea.appendText("\n".concat(event.getMessage()));
    }



@Component
@Log4j2
public class BenchmarkProgressServiceImpl implements BenchmarkProgressService {

    @Autowired
    private ApplicationContext context ;

    @Autowired
    private Executor executor;
(...)
    @Override
    public void registerListener(BenchmarkProgressListener listener) {
        this.listeners.add(listener);
    }

    @Override
    public void removeListener(BenchmarkProgressListener listener) {
        this.listeners.remove(listener);
    }

    @Override
    public synchronized void postMessage(String message) {
        log.info(message);
        executor.execute(  () -> {
          context.publishEvent(new BenchmarkProgressEvent(message));
        }
        );
        //listeners.forEach(l -> l.postMessage(message));

    }
}

1
  1. Do czego służy TextArea? Ma wyświetlać progres w stylu 1/13? Jeżeli tak to lepszy według mnie byłby Label.
  2. Operacje na bazie danych wykonują się po stronie klienta czy po stronie serwera? Jak po stronie klienta patrz punkt 3.
  3. Zamiast @EventListener użyj EventBusa z Guavy.
1

Ok znalazlam odpowiedz... Musialam zmienic moja metoda ktora wywolywala serwis, z zwracajacych wartosc na cos takiego :

    @Override
    public void runScenario5C(Integer seriesNumber, Long volume, Integer simPerRelationship, Integer iterations, Integer warmup) {
        exec.execute(() -> {
            ResultScenario5 result = scenario5cService.runScenario(seriesNumber, volume, simPerRelationship, iterations, warmup);
            context.publishEvent(result);
        });
    }

W ten sposob serwisy sa uruchamiane w innych watkach. I GUI idzie w glownym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1