Spring +JavaFX TextArea nie jest aktualizowana

Spring +JavaFX TextArea nie jest aktualizowana
VA
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:180
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.

Kopiuj
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()));
    }


Kopiuj

@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));

    }
}

MrMadMatt
  • Rejestracja:ponad 9 lat
  • Ostatnio:9 dni
  • Postów:373
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.
VA
TextAerea to pole tekstowe, jest tego torche za duzo na label, dlatego wlasnie tego uzywam, i tam beda wysylane wiadomosci z postepu, kroki, co sie dzieje i takie tam, operacje na bazie danych sa po stronei klienta, jest to aplikacja desktopowa. Jak sobie printuje te eventy, to one wykonuja sie prawidlowo. Dopiero appendText powoduje przyblokowanie. Jak ustawie jakis print przed i po appendText. To ten pierwszy sie pojawi. A ten drugi dopiero na koncu.
MrMadMatt
@Vanilka: A tego textArea masz w jakimś modalnym oknie? Pokaż jak chcesz aktualizować zawartość textArea.
VA
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 2 lata
  • Postów:180
1

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

Kopiuj
    @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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.