2014-04-03 75 views
0

我已經在我的用戶界面中放置了一個進度條和指示器,並試圖更新整個正在執行的代碼段的不同階段的進度,但它只是保持空白,然後在代碼塊已設置爲100已完成。JavaFX中的進度條

任何人都知道爲什麼這不是更新階段我的舞臺?

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

回答

2

您正在FX應用程序線程上運行所有內容,因此呈現線程無法呈現任何內容,直到整個方法完成。 (我猜NNSE.searchForWords(...)需要時間來執行。)

你需要把代碼放到一個Task,並調用TaskupdateProgress(...)方法。然後將您的ProgressBarprogressPropertyTaskprogressProperty綁定。從一個單獨的線程運行任務。