Я новичок в JavaFX и параллелизме.В настоящее время я пытаюсь лучше его освоить.
Я понимаю, что узлы JavaFX не являются поточно-ориентированными, и его обновления необходимо выполнять из потока приложения (UI).
ВВ следующем примере я использую метод javafx.application
runLater
для обновления метки, в противном случае я получу исключение.Но, с другой стороны, я могу обновить TextArea из фоновой задачи:
textArea.appendText(status+"\n");
Не могли бы вы помочь мне понять разницу между Label и TextArea в этом контексте и почему ее нельзя обновить в задаче BGа другой может?
package test;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class FxConcurrencyExample1 extends Application
{
// Create the TextArea
TextArea textArea = new TextArea();
// Create the Label
Label statusLabel = new Label("Not Started...");
// Create the Buttons
Button startButton = new Button("Start");
Button exitButton = new Button("Exit");
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(final Stage stage)
{
// Create the Event-Handlers for the Buttons
startButton.setOnAction(new EventHandler <ActionEvent>()
{
public void handle(ActionEvent event)
{
startTask();
}
});
exitButton.setOnAction(new EventHandler <ActionEvent>()
{
public void handle(ActionEvent event)
{
stage.close();
}
});
// Create the ButtonBox
HBox buttonBox = new HBox(5, startButton, exitButton);
// Create the VBox
VBox root = new VBox(10, statusLabel, buttonBox, textArea);
// Set the Style-properties of the VBox
root.setStyle("-fx-padding: 10;" +
"-fx-border-style: solid inside;" +
"-fx-border-width: 2;" +
"-fx-border-insets: 5;" +
"-fx-border-radius: 5;" +
"-fx-border-color: blue;");
// Create the Scene
Scene scene = new Scene(root,400,300);
// Add the scene to the Stage
stage.setScene(scene);
// Set the title of the Stage
stage.setTitle("A simple Concurrency Example");
// Display the Stage
stage.show();
}
public void startTask()
{
// Create a Runnable
Runnable task = new Runnable()
{
public void run()
{
runTask();
}
};
// Run the task in a background thread
Thread backgroundThread = new Thread(task);
// Terminate the running thread if the application exits
backgroundThread.setDaemon(true);
// Start the thread
backgroundThread.start();
}
public void runTask()
{
for(int i = 1; i <= 10; i++)
{
try
{
String status = "Processing " + i + " of " + 10;
System.out.println(status);
// Update the Label on the JavaFx Application Thread
Platform.runLater(new Runnable()
{
@Override
public void run()
{
statusLabel.setText(status);
}
});
textArea.appendText(status+"\n");
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
Спасибо, Пауло