This discussion is archived
3 Replies Latest reply: Oct 31, 2012 4:54 PM by jsmith RSS

How to update a set of JavaFX2.2 TextFields from a Service?

likejiujitsu Newbie
Currently Being Moderated
I am trying understand how to update a set of textfields in the JavaFX2.2 UI using a Service, but there are no samples nor tips for this in the documentation. Both the Addressbook and Ensemble samples deal with tables. The Service would return an ObservableList of Strings. How would one do the binding?

textField0 <---> observableList[0]

textField1 <---> observableList[1]

I modified the ServiceSample (Concurrency | Service sample at http://download.oracle.com/otndocs/products/javafx/2.2/samples/Ensemble/index.html) to have a ListView of TextFields but I do not know how to do the binding. What should I put instead of

tableView.itemsProperty().bind(service.valueProperty());
from Concurrency | Service sample at http://download.oracle.com/otndocs/products/javafx/2.2/samples/Ensemble/index.html

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.util.Date;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;

/**
* A sample showing use of a Service to retrieve data in a background thread.
* Selecting the Refresh button restarts the Service.
*
* @see javafx.collections.FXCollections
* @see javafx.concurrent.Service
* @see javafx.concurrent.Task
* @see javafx.scene.control.ProgressIndicator
* @see javafx.scene.control.TableColumn
* @see javafx.scene.control.TableView
*/
public class ServiceSample extends Application {

final GetDailySalesService service = new GetDailySalesService();

private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setScene(new Scene(root));

VBox vbox = new VBox(5);
vbox.setPadding(new Insets(12));
ListView<TextField> listView = new ListView<TextField>();
Button button = new Button("Refresh");
button.setOnAction(new EventHandler<ActionEvent>() {

public void handle(ActionEvent t) {
service.restart();
}
});
vbox.getChildren().addAll( listView, button);

Region veil = new Region();
veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");
ProgressIndicator p = new ProgressIndicator();
p.setMaxSize(150, 150);

p.progressProperty().bind(service.progressProperty());
veil.visibleProperty().bind(service.runningProperty());
p.visibleProperty().bind(service.runningProperty());
// what to put here ? tableView.itemsProperty().bind(service.valueProperty());

StackPane stack = new StackPane();
stack.getChildren().addAll(vbox, veil, p);

root.getChildren().add(stack);
service.start();
}

/**
* A service for getting the DailySales data. This service exposes an
* ObservableList for convenience when using the service. This
* <code>results</code> list is final, though its contents are replaced when
* a service call successfully concludes.
*/
public class GetDailySalesService extends Service<ObservableList<String>> {

/**
* Create and return the task for fetching the data. Note that this
* method is called on the background thread (all other code in this
* application is on the JavaFX Application Thread!).
*
* @return A task
*/
@Override
protected Task createTask() {
return new GetDailySalesTask();
}
}

public class GetDailySalesTask extends Task<ObservableList<String>> {      
@Override protected ObservableList<String> call() throws Exception {
for (int i = 0; i < 500; i++) {
updateProgress(i, 500);
Thread.sleep(5);
}
ObservableList<String> sales = FXCollections.observableArrayList();
sales.add(new String("A1"));
sales.add(new String("A2"));
return sales;
}
}

@Override public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) { launch(args); }
}

Edited by: likejiujitsu on Oct 31, 2012 1:44 PM

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points