Индикатор выполнения в JavaFX
Я поместил индикатор выполнения и индикатор в свой пользовательский интерфейс и пытался обновлять прогресс на разных этапах во время выполнения фрагмента кода, однако он просто остается пустым, а затем устанавливает себя равным 100 при завершении блока кода.
Кто-нибудь знает, почему это не обновление стадии моей стадии?
private void onSearchButtonClicked(ActionEvent event) throws InstantiationException, IllegalAccessException {
//progressBar.setVisible(true);
//progressIndicator.setVisible(true);
progressBar.setProgress(1);
progressIndicator.setProgress(1);
//mainWindow.getChildren().addAll(pb, pi);
try {
wordOne = NNSE.searchForWords(wordOneText.getText());
progressBar.setProgress(10);
progressIndicator.setProgress(10);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
wordTwo = NNSE.searchForWords(wordTwoText.getText());
progressBar.setProgress(30);
progressIndicator.setProgress(30);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
distance = wordNetMeasures.searchForWord(wordOneText.getText(), wordTwoText.getText());
linDisance = wordNetMeasures.linMethod(wordOneText.getText(), wordTwoText.getText());
leskDistance = wordNetMeasures.leskMethod(wordOneText.getText(), wordTwoText.getText());
euclideanDistance = NNSE.calculateDistance(wordOne, wordTwo);
progressBar.setProgress(50);
progressIndicator.setProgress(50);
//System.out.println("distance = " + euclideanDistance);
wordNetPercentage = wordNetMeasures.calculatePercentageForWordNetPair(distance);
wordNetPercentageLin = wordNetMeasures.calculatePercentageForWordNetPair(linDisance);
wordNetPercentageLesk = wordNetMeasures.calculatePercentageForWordNetPair(leskDistance);
ProjectProperties.getInstance().setWordOneText(wordOneText.getText());
ProjectProperties.getInstance().setWordTwoText(wordTwoText.getText());
//System.out.println("word net percentage" + wordNetPercentage);
nnsePercentage = NNSE.calculateSimilarityPercentageForNNSEPair(euclideanDistance);
//setting properties for these results
//ProjectProperties properties = new ProjectProperties();
String wordNetDistance = String.valueOf(df.format(distance));
ProjectProperties.getInstance().setPathWordNetText(wordNetDistance);
ProjectProperties.getInstance().setLinWordNetText((String.valueOf(df.format(linDisance))));
ProjectProperties.getInstance().setLeskWordNetText((String.valueOf(df.format(leskDistance))));
progressBar.setProgress(70);
progressIndicator.setProgress(70);
NNSEAccuraryLin = NNSE.calculateNNSEAccuracy(linDisance, euclideanDistance);
NNSEAccuracyLesk = NNSE.calculateNNSEAccuracy(leskDistance, euclideanDistance);
NNSEAccuracy = NNSE.calculateNNSEAccuracy(distance, euclideanDistance);
ProjectProperties.getInstance().setPathNNSEText((String.valueOf(df.format(euclideanDistance))));
ProjectProperties.getInstance().setLinNNSEText((String.valueOf(df.format(euclideanDistance))));
ProjectProperties.getInstance().setLeskNNSEText((String.valueOf(df.format(euclideanDistance))));
ProjectProperties.getInstance().setPathNNSEAccuracyText((String.valueOf(pf.format(NNSEAccuracy))));
ProjectProperties.getInstance().setLinNNSEAccuracyText((String.valueOf(pf.format(NNSEAccuraryLin))));
ProjectProperties.getInstance().setLeskNNSEAccuracyText((String.valueOf(pf.format(NNSEAccuracyLesk))));
progressBar.setProgress(80);
progressIndicator.setProgress(80);
Database databaseConnection = new Database();
try {
databaseConnection.getConnection();
databaseConnection.addWordNetToDatabase(NNSEAccuracy, ProjectProperties.getInstance().getWordOneText() + " ," + ProjectProperties.getInstance().getWordTwoText(), distance);
databaseConnection.addNNSEToDatabase(NNSEAccuracy, ProjectProperties.getInstance().getWordOneText() + " ," + ProjectProperties.getInstance().getWordTwoText(), euclideanDistance);
} catch (SQLException ex) {
Logger.getLogger(PairSearchPageController.class.getName()).log(Level.SEVERE, null, ex);
}
progressBar.setProgress(100);
progressIndicator.setProgress(100);
1 ответ
Вы выполняете все в потоке приложений FX, поэтому поток рендеринга не может ничего рендерить, пока не будет завершен весь метод. (Я предполагаю, что NNSE.searchForWords(...)
требуется время, чтобы выполнить.)
Вам нужно поместить код в задачу и вызвать Task
"s updateProgress(...)
метод. Затем свяжите свой ProgressBar
"s progressProperty
к Task
"s progressProperty
, Запустите задачу из отдельного потока.