2015-11-08 3 views
1

Я хочу изменить текст в разделе Индикатор выполнения. По умолчанию, когда ProgressIndicator завершил свой Progress, текст Done, я хочу иметь возможность редактировать этот текст с любым пользовательским текстом или текстом в зависимости от языкового стандарта.JavaFX Изменить текст в окне Индикатор выполнения

Когда я запускаю вывод программы, этот текст был изменен, но в графическом интерфейсе он не изменяется. Пожалуйста, смотрите на следующих рисунках:

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

Вы можете добавить код, который вы пробовали, если это возможно, пожалуйста, опубликовать [Minimal, полный и проверяемый пример] (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

Смежные вопросы