libros - javafx netbeans
El subprocesamiento mĂșltiple en JavaFX bloquea la interfaz de usuario (1)
Task
implementa Runnable
, así que cuando llamas a handler.run();
realmente ejecuta el método de call
en el subproceso de la interfaz de usuario. Eso colgará la interfaz de usuario.
Debe iniciar la tarea en un subproceso en segundo plano, ya sea a través de un ejecutor o simplemente llamando al new Thread(handler).start();
.
Esto se explica (tal vez no muy claramente) en el javadoc o en el tutorial de concurrencia de JavaFX .
Tengo una aplicación JavaFX 2 simple, con 2 botones, que dice Iniciar y Detener. Cuando se hace clic en el botón de inicio, quiero crear un hilo de fondo que procesará y actualizará la interfaz de usuario (por ejemplo, una barra de progreso) a medida que avanza. Si se hace clic en el botón de parada, quiero que el hilo termine.
He intentado hacer esto con la clase javafx.concurrent.Task
que reuní de la documentación funcionaría bien para esto. Pero cada vez que hago clic en Inicio, la interfaz de usuario se bloquea / bloquea en lugar de permanecer normal.
Myprogram extends Application
está el código del programa principal Myprogram extends Application
clase de Myprogram extends Application
para mostrar los botones:
public void start(Stage primaryStage)
{
final Button btn = new Button();
btn.setText("Begin");
//This is the thread, extending javafx.concurrent.Task :
final MyProcessor handler = new MyProcessor();
btn.setOnAction(new EventHandler<ActionEvent>()
{
public void handle(ActionEvent event)
{
handler.run();
}
});
Button stop = new Button();
stop.setText("Stop");
stop.setOnAction(new EventHandler<ActionEvent>()
{
public void handle(ActionEvent event)
{
handler.cancel();
}
}
);
// Code for adding the UI controls to the stage here.
}
Aquí está el código de la clase MyProcessor
:
import javafx.concurrent.Task;
public class MyProcessor extends Task
{
@Override
protected Integer call()
{
int i = 0;
for (String symbol : feed.getSymbols() )
{
if ( isCancelled() )
{
Logger.log("Stopping!");
return i;
}
i++;
Logger.log("Doing # " + i);
//Processing code here which takes 2-3 seconds per iteration to execute
Logger.log("# " + i + ", DONE! ");
}
return i;
}
}
Bastante simple, pero la interfaz de usuario se bloquea cada vez que hago clic en el botón Inicio, aunque los mensajes de la consola continúan Logger.log
( Logger.log
simplemente hace System.out.println
)
¿Qué estoy haciendo mal?