2015-11-08 63 views
1

我想更改進度指示器下的文本。默認情況下,當ProgressIndicator完成其進度時,文本已完成,我希望能夠根據區域設置使用任何用戶定義的文本或文本編輯此文本。JavaFX在進度指示器下更改文本

當我運行程序輸出顯示文本已被更改,但在GUI上它不會更改。請看下面的圖片:

enter image description here enter image description here

MCVE

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.concurrent.Task; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ProgressIndicator; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class Main extends Application { 
    Task copyWorker; 
    public static void main(String[] args) { 
     Application.launch(args); 
    } 
    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Background Processes"); 
     Group root = new Group(); 
     Scene scene = new Scene(root, 330, 120, Color.WHITE); 

     BorderPane mainPane = new BorderPane(); 
     root.getChildren().add(mainPane); 

     final Label label = new Label("Files Transfer:"); 
     final ProgressIndicator progressIndicator = new ProgressIndicator(0); 
     progressIndicator.progressProperty().addListener(new ChangeListener<Number>() { 
     @Override 
     public void changed(ObservableValue<? extends Number> ov, Number t, Number newValue) { 
      progressIndicator .applyCss(); 

      // If progress is 100% then show Text 
      if (newValue.doubleValue() >= 1.0) { 
       // Apply CSS so you can lookup the text 
       Text text = (Text) progressIndicator .lookup(".percentage");//also I checked .lookup(.text.percentage) version 
       System.out.println(text.getText()); 
       // This text replaces "Done" 
       text.setText("some text"); 
       //for testing 
       Text x= (Text) progressIndicator .lookup(".percentage");     
       System.out.println(x.getText());//output shows that the text under progress indicator is changed 
       } 
     }}); 
     final HBox hb = new HBox(); 
     hb.setSpacing(5); 
     hb.setAlignment(Pos.CENTER); 
     hb.getChildren().addAll(label, progressIndicator); 
     mainPane.setTop(hb); 

     final Button startButton = new Button("Start"); 
     final Button cancelButton = new Button("Cancel"); 
     final HBox hb2 = new HBox(); 
     hb2.setSpacing(5); 
     hb2.setAlignment(Pos.CENTER); 
     hb2.getChildren().addAll(startButton, cancelButton); 
     mainPane.setBottom(hb2); 

     startButton.setOnAction(new EventHandler<ActionEvent>() { 

      public void handle(ActionEvent event) { 
       startButton.setDisable(true); 
       progressIndicator.setProgress(0); 
       cancelButton.setDisable(false); 
       copyWorker = createWorker(); 

       progressIndicator.progressProperty().unbind(); 
       progressIndicator.progressProperty().bind(copyWorker.progressProperty()); 

       copyWorker.messageProperty().addListener(new ChangeListener<String>() { 
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
         System.out.println(newValue); 
        } 
       }); 

       new Thread(copyWorker).start(); 
      } 
     }); 
     cancelButton.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent event) { 
       startButton.setDisable(false); 
       cancelButton.setDisable(true); 
       copyWorker.cancel(true); 
       progressIndicator.progressProperty().unbind(); 
       progressIndicator.setProgress(0); 
       System.out.println("cancelled."); 
      } 
     }); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public Task createWorker() { 
     return new Task() { 
      @Override 
      protected Object call() throws Exception { 
       for (int i = 0; i < 10; i++) { 
        Thread.sleep(100); 
        updateMessage("100 milliseconds"); 
        updateProgress(i + 1, 10); 
       } 
       return true; 
      } 
     }; 
    } 
} 
+0

你可以添加你已經嘗試了代碼,如果可能的話請發表[最小,完整,可驗證的示例](HTTP ://stackoverflow.com/help/mcve)。 – ItachiUchiha

+0

您可以克隆整個項目https://github.com/shikimaru/XDMExamples.git – sakit

+0

爲什麼要這樣做?如果你需要幫助,你必須重視在這裏幫助你的人的時間和精力。 – ItachiUchiha

回答

1

您需要更改ProgressIndicator的文本以及該ProgressIndicator的寬度設定爲新的寬度的文字。

progressIndicator.progressProperty().addListener((ov, oldValue, newValue) -> { 
    Text text = (Text) progressIndicator.lookup(".percentage"); 
    if(text!=null && text.getText().equals("Done")){ 
     text.setText("New Text"); 
     progressIndicator.setPrefWidth(text.getLayoutBounds().getWidth()); 
    } 
}); 

enter image description here

完整代碼

import javafx.application.Application; 
import javafx.concurrent.Task; 
import javafx.geometry.Pos; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ProgressIndicator; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class Main extends Application { 
    Task copyWorker; 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("Background Processes"); 
     Group root = new Group(); 
     Scene scene = new Scene(root, 330, 120, Color.WHITE); 

     BorderPane mainPane = new BorderPane(); 
     root.getChildren().add(mainPane); 

     final Label label = new Label("Files Transfer:"); 
     final ProgressIndicator progressIndicator = new ProgressIndicator(0); 

     final HBox hb = new HBox(); 
     hb.setSpacing(5); 
     hb.setAlignment(Pos.CENTER); 
     hb.getChildren().addAll(label, progressIndicator); 
     mainPane.setTop(hb); 

     final Button startButton = new Button("Start"); 
     final Button cancelButton = new Button("Cancel"); 
     final HBox hb2 = new HBox(); 
     hb2.setSpacing(5); 
     hb2.setAlignment(Pos.CENTER); 
     hb2.getChildren().addAll(startButton, cancelButton); 
     mainPane.setBottom(hb2); 

     startButton.setOnAction(event -> { 
      startButton.setDisable(true); 
      progressIndicator.setProgress(0); 
      cancelButton.setDisable(false); 
      copyWorker = createWorker(); 

      progressIndicator.progressProperty().unbind(); 
      progressIndicator.progressProperty().bind(copyWorker.progressProperty()); 

      new Thread(copyWorker).start(); 
     }); 

     cancelButton.setOnAction(event -> { 
      startButton.setDisable(false); 
      cancelButton.setDisable(true); 
      copyWorker.cancel(true); 
      progressIndicator.progressProperty().unbind(); 
      progressIndicator.setProgress(0); 
     }); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 

     progressIndicator.progressProperty().addListener((observable, oldValue, newValue) -> { 
      Text text = (Text) progressIndicator.lookup(".percentage"); 
      if (text != null && text.getText().equals("Done")) { 
       text.setText("New Text"); 
       progressIndicator.setPrefWidth(text.getLayoutBounds().getWidth()); 
      } 
     }); 
    } 

    public Task createWorker() { 
     return new Task() { 
      @Override 
      protected Object call() throws Exception { 
       for (int i = 0; i < 10; i++) { 
        Thread.sleep(500); 
        updateMessage("2000 milliseconds"); 
        updateProgress(i + 1, 10); 
       } 
       return true; 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 
+0

Itachi我更改了代碼,但不起作用 – sakit

+0

您的解決方案適用於此項目。但是當我在我的原始項目中使用相同的東西時,它不起作用。我不知道爲什麼。我的java版本是1.8.60 – sakit

+0

那麼,我已經在JDK 1.8.0_60上測試過了,它可以工作,所以問題不在於版本。實施必須有一些問題。 – ItachiUchiha