I have a JavaFX with TabPane which holds Java Objects with data into different tabs. I found that when the content of the tab takes time to load because there are SQL queries for execution the application just hangs. Is there any way to display some "Loading" message during the content utilization? for example:

```
Tab.setContent(<some_heavy_Java_Object>);

```

Is there any workaround to solve this in JavaFX or Java?

P.S I tested this code sample but I get error when I try to run the code:

```
TabContentInfrastructure content;

class GetDailySalesService extends Service<ObservableList<Object>>
{

    @Override
    protected Task createTask()
    {
        return new GetDailySalesTask();
    }
}

class GetDailySalesTask extends Task<ObservableList<Object>>
{

    @Override
    protected ObservableList<Object> call() throws Exception
    {

        content = new TabContentInfrastructure();

        return (ObservableList<Object>) content.initTestTabContentData();
    }
}

..........

            VBox vbox = new VBox();

            content = new TabContentInfrastructure();

            vbox.getChildren().add(content.initTestTabContentData());

            GetDailySalesService service = new GetDailySalesService();

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

            p.progressProperty().bind(service.progressProperty());
            veil.visibleProperty().bind(service.runningProperty());
            p.visibleProperty().bind(service.runningProperty());
            //tableView.itemsProperty().bind(service.valueProperty());

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

            service.start();

            tabdata.setContent(stack);

```

Can you help me to solve this issue.

Another attempt to solve the issue:

```
Task<VBox> task = new Task<VBox>()
                {
                    @Override
                    protected VBox call() throws Exception
                    {
                        TabContentInfrastructure content = new TabContentInfrastructure();

                        return content.initTestTabContentData();
                    }
                };

                Thread th = new Thread(task);
                th.setDaemon(true);
                th.start();

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

                //p.progressProperty().bind(service.progressProperty());
                veil.visibleProperty().bind(task.runningProperty());
                p.visibleProperty().bind(task.runningProperty());
                //vb.visibleProperty().bind(service.runningProperty().not());
                //tableView.itemsProperty().bind(service.valueProperty());

                StackPane stack = new StackPane();

                task.setOnSucceeded(new EventHandler<WorkerStateEvent>()
                {
                    @Override
                    public void handle(WorkerStateEvent t){

                        System.out.print("Entered setOnSucceeded**********" + t.getSource().getValue());
                        stack.getChildren().clear();
                        stack.getChildren().addAll(task.getValue());

                    }
                });

                stack.getChildren().addAll(veil, p);
                tabdata.setContent(stack);

```

This time the result is null.

And another unsuccessful attempt.

```
StackPane stack = new StackPane();
                Region veil = new Region();
                ProgressIndicator p = new ProgressIndicator();

                Task<VBox> task = new Task<VBox>()
                { // create new task
                    @Override
                    public VBox call() throws InterruptedException
                    {

                        Platform.runLater(new Runnable()
                        { // USE THIS INSTEAD

                            @Override
                            public void run()
                            {
                                try
                                {
                                    // ui updates here(inside application thread)
                                    // this is needed if you want to update your ui
                                    // you cannot update any ui from outside the application thread

                                    TabContentInfrastructure content = new TabContentInfrastructure();
                                    //stack.getChildren().clear();

                                    stack.getChildren().addAll(content.initTestTabContentData());
                                }
                                catch (InterruptedException ex)
                                {
                                    //Logger.getLogger(InfrastructureDataTabs.class.getName()).log(Level.SEVERE, null, ex);
                                }

                            }
                        });
                        return null;

                    }
                };

                new Thread(task).start();

                veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");
                veil.setPrefSize(240, 160);

                p.setMaxSize(140, 140);

                p.progressProperty().bind(task.progressProperty());
                veil.visibleProperty().bind(task.runningProperty());
                p.visibleProperty().bind(task.runningProperty());
                //vb.visibleProperty().bind(service.runningProperty().not());
                //tableView.itemsProperty().bind(service.valueProperty());

               stack.getChildren().addAll(veil, p);

               tabdata.setContent(stack);

```