Я пытаюсь получить простой пример привязки данных для лучшего понимания, используя класс обслуживания JavaFX и, возможно, включив его в проект, над которым я работаю, однако я не смог связать значение, из которого должно быть возвращено служба (целое число) для целого числа в классе, который вызывает службу.
Я проверил отладчик и подтвердил, что задача фактически возвращает значение, но я продолжаю получать исключение нулевого указателя, утверждающее, что я "не могу связать с нулем" для строки кода, которая выполняет привязку, однако другие свойства что я связал, кажется, работает нормально
Основной класс
public class Main extends Application {
private Service<ObservableValue<Integer>> service;
@Override
public void start(Stage primaryStage){
/**********************************
* Start of Multi-Threading Logic
**********************************/
service = new EmployeeService();
ObjectProperty<Integer> size = new SimpleObjectProperty<>(0);
size.bind(service.getValue()); // Null Pointer Exception Cause
progressBar.progressProperty().bind(service.progressProperty());
progressBar.visibleProperty().bind(service.runningProperty());
progressLabel.textProperty().bind(service.messageProperty());
progressLabel.setVisible(false);
/*************************************************************
* Start Task Button Event Handler
*
* If the service state is succeeded or cancelled
* then the service must first be reset before starting
*
* if the service state is ready then start the service
*
* if the service state is something other than the above
* like running or failed, then do nothing
*************************************************************/
startTaskButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if(service.getState() == Service.State.SUCCEEDED
|| service.getState() == Service.State.CANCELLED) {
service.reset();
service.start();
}else if(service.getState() == Service.State.READY) {
service.start();
}else {
System.out.println("Not doing anything");
}
}
});
/*************************************************************
* Cancel Task Button Event Handler
*
* The service should only be canceled if it is currently
* running, else do nothing.
*************************************************************/
cancelButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if(service.getState() == Service.State.RUNNING) {
service.cancel();
}
}
});
Сервисный класс
/*************************************************************
* Custom Service Impl class that creates the DisplayDataTask
*************************************************************/
class EmployeeService extends Service<ObservableValue<Integer>>{
@Override
protected Task<ObservableValue<Integer>> createTask() {
return new DisplayDataTask();
}
}
Task Impl Class
/*************************************************************
* Custom Task Impl class that creates a basic list
* and returns the length of the list in the call method
*************************************************************/
class DisplayDataTask extends Task<ObservableValue<Integer>> {
@Override
protected ObservableValue<Integer> call() throws Exception {
int randomNum = 71890;
Thread.sleep(5000); // Sleep for 5 seconds to simulate a task
ObjectProperty<Integer> size = new SimpleIntegerProperty(randomNum).asObject();
return size;
}
@Override
protected void cancelled() {
super.cancelled();
updateMessage("Operation Cancelled");
System.out.println("The " + this.getClass().getSimpleName() + " has been canceled.");
}
}