I'm trying to make changes to my GUI in JavaFX by doing the work on a separate thread and returning the object required. However, after doing the work and task.setOnSucceeded() is triggered I attempt to retrieve the created object and get the error "incompatible types: Object cannot be converted to type VideoScrollPane".
I think this has something to do with raw types as it's within the listener this is happening but after looking around I couldn't find the suggestions I was looking for.
Any light that can be shed would be much appreciated.
Task task = new Task() {
VideoScrollPane vsp;
@Override protected VideoScrollPane call() {
try {
System.out.print("thread...");
ExecutorService executor = Executors.newCachedThreadPool();
Future future = executor.submit(new Callable() {
@Override public VideoScrollPane call() {
return new VideoScrollPane(mediaview, vboxCentre, username, project);
}
});
vsp = future.get();
} catch(Exception exception) { System.out.println(exception.getMessage()); }
return vsp;
}
};
new Thread(task).start();
task.setOnSucceeded(new EventHandler() {
@Override public void handle(WorkerStateEvent t) {
System.out.println("complete");
try {
//where the problem occurs
VideoScrollPane v = task.get();
} catch(Exception exception) { System.out.println(exception.getMessage()); }
}
});
解决方案
This is because the task.get() is returning a value of type Object, but you're trying to assign it to v, which is a VideoScrollPane. You can prevent the error by doing a cast, like so
VideoScrollPane v = (VideoScrollPane)task.get();
Be warned, if task.get() returns something that isn't a VideoScrollPane, you'll get a ClassCastException.
If you want to prevent the problem entirely however, consider fixing the declaration of task, by including a type for the generic parameter. You could change it to,
Task task = new Task() {
This way, task.get() will now return a VideoScollPane, and you won't need a cast.