ProgressIndicator - JavaFx

0

Witam,
chciałbym dodać do mojego programu ProgressIndicator który wskazywał by postęp w tworzeniu tabel w bazie danych. Chwile to zajmuje, a chciałbym żeby użytkownik wiedział ze coś się dzieje, a nie program się zaciął. Nie mogę niestety znaleźć żadnych przydatnych mi informacji na ten temat.

Znalazłem jedynie na stronie Oracle dokumentacje o ProgressIndicator i pokazane jest jak zrobić to na Sliderze z użyciem Listenera, lecz ja bym chciał aby to wywołało się po naciśnięciu przycisku jednocześnie z tworzeniem się tabel.

Mógłby mi ktoś pomóc z tym problemem?

Dziękuję za wszystkie odpowiedzi

Pozdrawiam
Normaidian

0

Na stronie oracle masz wszystko opisane. Możesz wywoływać metodę setProgress na indicatorze po utworzeniu każdej tabeli. Pamiętaj też, że nie możesz wywołać tego z innego wątku. Najprościej obejść to tym:
https://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater(java.lang.Runnable)

0

@Jaca777
używam setProgress i robię tak jak mówisz, używam po utworzeniu każdej tabeli, ale mimo to porgressIndicator pojawia się dopiero po wykonaniu wszystkiego z końcową wartością.

0

Bez kodu trudno ustalić, co robisz źle.

0

@Jaca777
To jest metoda wywoływana po kliknięciu przycisku. Tak jak widać chciałbym żeby po każdym wykonanej metodzie indicator zwiększył się o jakiś stopień.

@FXML
	ProgressIndicator progress;
@FXML
	public void accept() {
                progress.setVisible(true);
		db.InputDatabaseName(dbName.getText(), true, utworzenieKoduPlanu());
		progress.setProgress(0.1);
		db.Connector();
		progress.setProgress(0.1);
		db.CreateDB(dbName.getText());
		progress.setProgress(0.1);
		db.ChooseDB(dbName.getText());
		progress.setProgress(0.1);
		db.CreateTabel();
		progress.setProgress(0.1);
		db.CloseConn();
		progress.setProgress(0.1);

		mc.hideSecondPane();
		mc.shadowRegion.setVisible(false);
		mc.setSelectOption(mc.createAccountButton, 1);
		mc.disableButtons();

	}

Teraz jeszcze tak pomyślałem, że wystarczyło by jakby na czas wykonywania tych działań mogłoby być po porostu te kółko kręcące się bez pokazywania procentów.

0

Za każdym razem ustawiasz postęp na 10%. Set to nie to samo co add.

1

@Normaidian wiesz co to jest Event Dispatch Thread i jak działa? Aktualizowanie widoku odbywa się tylko między kolejnymi akcjami wykonywanymi na EDT. Jeśli w jednej akcji pokażesz np przycisk i go usuniesz to nie zobaczysz żadnego wyniku na ekranie. Między tymi akcjami musisz zwrócić sterowanie do EDT, by JavaFX zaktualizowała widok. To podobna sprawa jak w JavaScripcie, tyle że w JS nie możesz tworzyć osobnych wątków w ogóle i trudniej jest robić asynchroniczne długotrwałe obliczenia. W JavieFX możesz sobie na osobnym wątku robić asynchroniczne obliczenia i aktualizować widok od czasu do czasu za pomocą Platform.runLater()

Edit:
Inaczej mówić - dopóki siedzisz w EDT to widok nie będzie zaktualizowany. Musisz co jakiś czas wychodzić by widok się odświeżał i reagował na akcje użytkownika. Pamiętaj, że cała obsługa widoku (wraz z obsługą zdarzeń od użytkownika) dzieje się właśnie w tym jednym wątku - EDT. Logiczne jest więc, że jak blokujesz EDT przez długi czas to blokujesz też widok - jeśli blokujesz przez wiele sekund to taki Windows wyszarza okno i stwierdza, że aplikacja się zawiesiła.

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