2012-07-28 15 views
6

Estoy utilizando la clase Task para ejecutar tareas en segundo plano en la aplicación javafx para recuperar los datos de la base de datos.Cómo utilizar el valor de retorno del método de llamada de la clase Task en Javafx

public class CustomTask extends Task<ObservableList<ObservableList>> { 

TableView tableview; 

ObservableList<ObservableList> data; 
public CustomTask(TableView tableview) { 
    this.tableview=tableview; 
} 

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

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    Date date = new Date(); 
    String SQL = "SELECT * from sell where Date='" + dateFormat.format(date) + "'"; 
    ResultSet rs = DBConnect.getResultSet(SQL); 

    data = DBConnect.generateListDateFromTable(rs, true); 
    return data; 
} 

}

Cómo utilizar el objeto de datos.

Respuesta

12

Enlace a la tarea value property O proporcione un controlador de eventos task.setOnSucceeded() y llame a task.getValue() en el controlador de eventos provisto.

+2

¿Hay algún ejemplo de cómo hacer esto? –

+0

¿simplemente onSucceeded devuelve valor o onCanceled/onFailed? Me pregunto si cancelo la tarea para obtener el valor actual pero no estoy seguro si el enlace es la única forma. gracias – Ewoks

+0

[setOnSucceeded] (https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html#setOnScheduled-javafx.event.EventHandler-) no tiene nada que ver con el valor de la tarea, es solo un controlador de eventos que se ejecutará cuando la tarea tenga éxito. Si desea obtener el valor correspondiente, puede ejecutar [task.getValue()] (https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html#getValue--) en el cuerpo del controlador de eventos (como la respuesta de Marc a esta pregunta). – jewelsea

20

Ejemplo 1 addEventHandler

MyResultObjectType result; 
CustomTask task = new CustomTask(); 
task.addEventHandler(WorkerStateEvent.WORKER_STATE_SUCCEEDED, 
     new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent t) { 
     result = task.getValue(); 
    } 
}); 

Ejemplo 2 setOnSucceeded

MyResultObjectType result; 
CustomTask task = new CustomTask(); 
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent t) { 
     result = task.getValue(); 
    } 
}); 

Ejemplo 3 addListener

task.valueProperty().addListener(new ChangeListener<Task>() { 
    @Override 
    public void changed(ObservableValue<? extends mytype> obs, 
         mytype oldValue, mytype newValue) { 
     if (newValue != null) { 
      System.out.println("Result = " + newValue); 
     } 
    } 
}); 
Cuestiones relacionadas