JavaFX中的进度条 [英] Progress bar in JavaFX

查看:173
本文介绍了JavaFX中的进度条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的UI中放置了一个进度条和指示器,并尝试在正在执行的一段代码中的不同阶段更新进度,但它只是保持空白,然后在代码块完成时将自身设置为100。 / p>

任何人都知道为什么这不是我的舞台更新阶段?

  private void onSearchButtonClicked(ActionEvent event)抛出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);

//设置这些结果的属性
// 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);

数据库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);


解决方案

您正在运行FX应用程序线程上的所有内容,因此,在整个方法完成之前,渲染线程无法渲染任何内容。 (我猜测 NNSE.searchForWords(...)需要时间来执行。)



你需要将代码放入任务,以及调用任务 updateProgress(...)方法。然后将 ProgressBar progressProperty 绑定到任务' s progressProperty 。从单独的线程运行任务。


I have placed a progress bar and indicator in my UI and attempted to update the progress at different stages throughout a section of code being executed however it just stays blank and then sets itself to 100 whenever the code block has been completed.

Anyone know why this is not updating stage my stage?

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

解决方案

You're running everything on the FX Application Thread, so the rendering thread can't render anything until the entire method is complete. (I'm guessing that NNSE.searchForWords(...) takes time to execute.)

You need to put the code into a Task, and call the Task's updateProgress(...) method. Then bind your ProgressBar's progressProperty to the Task's progressProperty. Run the Task from a separate thread.

这篇关于JavaFX中的进度条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆