2015-07-27 4 views
1

Я хотел бы добавить текстовую область, где пользователь может видеть некоторую информацию, которую я могу видеть на консоли, пока индикатор выполнения обновляется.Текстовая область для индикатора выполнения

Как добавить область текста?

Вот пример кода, который я использовал для создания индикатора выполнения. Могу ли я добавить ниже индикатор выполнения области текста, которая должна заполняться во время вычислений?

import javafx.application.Application; 
import javafx.concurrent.Task; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ProgressBar; 
import javafx.scene.control.ProgressIndicator; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class ProgressDialogExample extends Application { 
static int option = 0; 
static ProgressForm pForm = new ProgressForm(); 

@Override 
public void start(Stage primaryStage) { 
    Button startButton = new Button("Start"); 
    startButton.setOnAction(e -> { 

     // In real life this task would do something useful and return 
     // some meaningful result: 
      Task<Void> task = new Task<Void>() { 
       @Override 
       public Void call() throws InterruptedException { 
        for (int i = 0; i < 10; i++) { 
         updateProgress(i, 10); 
         Thread.sleep(200); 
        } 
        updateProgress(10, 10); 
        return null; 
       } 
      }; 

      // binds progress of progress bars to progress of task: 
      pForm.activateProgressBar(task); 

      // in real life this method would get the result of the task 
      // and update the UI based on its value: 
      task.setOnSucceeded(event -> { 
       startButton.setDisable(false); 
      }); 

      startButton.setDisable(true); 
      pForm.getDialogStage().show(); 

      Thread thread = new Thread(task); 
      thread.start(); 
     }); 

    StackPane root = new StackPane(startButton); 
    Scene scene = new Scene(root, 350, 75); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 

} 

private int closeWindow() { 
    return option; 
} 

private static void setCloseWindow() { 
    // TODO Auto-generated method stub 
    option = 1; 
} 

public static class ProgressForm { 
    private final Stage dialogStage; 
    private final ProgressBar pb = new ProgressBar(); 
    private final ProgressIndicator pin = new ProgressIndicator(); 

    public ProgressForm() { 
     dialogStage = new Stage(); 
     dialogStage.initStyle(StageStyle.UTILITY); 
     // dialogStage.setResizable(false); 
     // dialogStage.setWidth(400); 
     // dialogStage.setHeight(300); 
     // final VBox vbox = new VBox(); 
     dialogStage.initModality(Modality.APPLICATION_MODAL); 

     final Button exitButton = new Button("Exit"); 
     exitButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent e) { 
       pForm.getDialogStage().close(); 
       setCloseWindow(); 
      } 
     }); 
     // PROGRESS BAR 

     pb.setProgress(-1F); 
     pin.setProgress(-1F); 

     final HBox hb = new HBox(); 
     hb.setSpacing(5); 
     hb.setAlignment(Pos.CENTER); 
     hb.getChildren().addAll(pb, pin, exitButton); 

     Scene scene = new Scene(hb); 

     dialogStage.setScene(scene); 
    } 

    public void activateProgressBar(final Task<?> task) { 
     pb.progressProperty().bind(task.progressProperty()); 
     pin.progressProperty().bind(task.progressProperty()); 
     dialogStage.show(); 
    } 

    public Stage getDialogStage() { 
     return dialogStage; 
    } 
} 

public static void main(String[] args) { 
    launch(args); 
} 
} 

ответ

0

Вы слышали LabelLabelled перед использованием Label вместо текста Node вы хотите использовать, и написать свой текст, если вы хотите, если вы хотите, чтобы показать ваши индикаторы выполнения делать

Label.setGraphic(myprogressbarNode); 

Надеются, что это помогает

EDIT

Я хотел бы добавить текстовую область, в которой пользователь может увидеть некоторую информацию, которую я могу увидеть в консоли, а индикатор выполнения обновления ... Могу ли я добавить ниже строки состояния область текста, которая должна заполняться, пока вычисления являются кобылой?

и я дал вам решение.

Предположим, у вас есть ProgressBarpb; и вы добавляете ваш ProgressBar к StackPane вам не нужно добавлять ProgressBar напрямую, а добавить свой Text, который вы реализуете что Label так полагаю, ваш Label является lb это как ваш код будет выглядеть

StackPane sp; // parent 
ProgressBar pb; // progress indicator 
Lable lb; // my text area 

sp.getChildren().add(lb);// i have added the text area 
lb.setGraphic(pb); we have added the progressbar to the text area 
lb.setContentDisplay(ContentDisplay.***);//the *** represents the position you want your graphic 
//whether top or left or bottom 
//now you are done, your pb will show aligned to your lb, and be updated 
//if you want to show text lb.setText("your text"); 

как это неявно? :-)

+0

Вы можете быть немного более явным? Я не понимаю решение – spoke

+0

@spoke check edit – Elltz

0

Попробуйте добавить слушателя messageProperty по задаче, которая будет добавлять текст в TextArea всякий раз, когда она изменяется.

TextArea ta = new TextArea(); 

public void activateTextArea(final Task<?> task) { 
    task.messageProperty().addListener((property, oldValue, newValue) -> { 
     ta.setText(ta.getText() + "\n" + newValue); 
    }); 
} 

Затем положить что-то вроде этого внутри задачи:

Task<Void> task = new Task<Void>() { 
    @Override 
    public Void call() throws InterruptedException { 
     for (int i = 0; i < 10; i++) { 
      updateProgress(i, 10); 
      updateMessage((i*10) + "% done"); 
      Thread.sleep(200); 
     } 
     updateProgress(10, 10); 
     updateMessage("All done!"); 
     return null; 
    } 
}; 
+0

не работает. он дает мне ошибку для свойства и новое значение – spoke

+0

Только что заметил опечатку в коде, который я разместил. Попробуйте поместить запятую между oldValue и newValue –

+0

еще, когда я добавляю «ta» в GridPane, я получаю сообщение об ошибке, потому что я должен объявить ta как static. Есть ли решение? – spoke

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