我正在尝试获得一个简单的数据结合示例,以便使用Javafx服务类更好地理解,并可能将其纳入我正在从事的项目中,但是我无法将shoudl从服务(整数(返回到呼叫服务的整数中的值。
我已经检查了调试器,并确认任务实际上是返回值,但是我一直在获取一个null指针例外,指出我对具有绑定的代码行"无法绑定到null",但是,其他属性,其他属性我弯曲似乎很好
主类
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();
}
}
});
服务Impl Class
/*************************************************************
* Custom Service Impl class that creates the DisplayDataTask
*************************************************************/
class EmployeeService extends Service<ObservableValue<Integer>>{
@Override
protected Task<ObservableValue<Integer>> createTask() {
return new DisplayDataTask();
}
}
任务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.");
}
}
Service.getValue()
返回服务的当前值,在服务完成之前,它将返回null。
您几乎肯定不希望该服务在此处返回ObservableValue<Integer>
,您希望它返回实际的Integer
。因此,将服务重写为:
class EmployeeService extends Service<Integer>{
@Override
protected Task<Integer> createTask() {
return new DisplayDataTask();
}
}
class DisplayDataTask extends Task<Integer> {
@Override
protected Integer call() throws Exception {
int randomNum = 71890;
Thread.sleep(5000); // Sleep for 5 seconds to simulate a task
Integer size = randomNum ;
return size;
}
@Override
protected void cancelled() {
super.cancelled();
updateMessage("Operation Cancelled");
System.out.println("The " + this.getClass().getSimpleName() + " has been canceled.");
}
}
然后您只能做
size.bind(service.valueProperty());