Индикатор выполнения в 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, Запустите задачу из отдельного потока.

Другие вопросы по тегам