color - setfont javafx
Texto de actualización automática de desplazamiento automático JavaFX (1)
- Para registrar cadenas, puede usar TextArea
- Para que sea asincrónico, debe crear un hilo separado para el lector de salida.
public class DoTextAreaLog extends Application {
TextArea log = new TextArea();
Process p;
@Override
public void start(Stage stage) {
try {
ProcessBuilder pb = new ProcessBuilder("ping", "stackoverflow.com", "-n", "100");
p = pb.start();
// this thread will read from process without blocking an application
new Thread(new Runnable() {
@Override
public void run() {
try {
//try-with-resources from jdk7, change it back if you use older jdk
try (BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = bri.readLine()) != null) {
log(line);
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}).start();
stage.setScene(new Scene(new Group(log), 400, 300));
stage.show();
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public void stop() throws Exception {
super.stop();
// this called on fx app close, you may call it in user action handler
if (p!=null ) {
p.destroy();
}
}
private void log(final String st) {
// we can access fx objects only from fx thread
// so we need to wrap log access into Platform#runLater
Platform.runLater(new Runnable() {
@Override
public void run() {
log.setText(st + "/n" + log.getText());
}
});
}
public static void main(String[] args) {
launch();
}
}
La pregunta de un novato acerca de JavaFX que no he podido responder, a pesar de saber que debe ser bastante simple de hacer y no encontrar recursos en ella en ningún lado (tutoriales, muchos de los documentos en línea de Oracle, artículos, el bloggers conocidos de JavaFX, etc.)
Estoy desarrollando una aplicación de ejecución de línea de comandos (script) y obtuve resultados exitosamente (a través de ProcessBuilder) del script que puedo mostrar de forma continua, tal como sucede en la línea de comandos. Es decir, puedo hacer System.out.println(line);
durante todo el día, mostrando el resultado en la consola, que simplemente devuelve el resultado de un flujo de entrada devuelto por el ''myProcess'' que se está ejecutando, creado así:
BufferedReader bri = new BufferedReader(new InputStreamReader(myProcess.getInputStream()))
De modo que puedo ver toda la salida del script.
Me gustaría configurar un JavaFX TextArea o ScrollPane o, no estoy seguro de qué, para mostrar este texto de salida (hay muchos, como varios miles de líneas) como un ''progreso'' continuo de lo que está sucediendo en el script, como sucede. Tengo una Escena, tengo botones y obtengo entrada de esta escena para iniciar la secuencia de comandos en ejecución, pero ahora me gustaría mostrar el resultado de hacer clic en el botón "EJECUTAR ESTE GUIÓN", por así decirlo.
Supongo que necesito crear un TextArea como se describe aquí o quizás un TextBuilder sería útil para comenzar a crearlo . No es seguro.
Necesito un poco de ayuda sobre cómo configurar la parte de encuadernación o de desplazamiento automático / actualización automática.
¿Alguien puede proporcionarme un lugar para comenzar, para hacer esto con JavaFX? Prefiero no usar Swing.
(Estoy usando JavaFX 2.2, JDK 1.7u7, todo lo último, y sí, esta es una aplicación de FXML, por lo que sería preferible hacerlo de esa manera).
ACTUALIZACIÓN: la respuesta de Sergey Grinev fue muy útil en la parte vinculante. Pero aquí hay más detalles sobre a qué me refiero cuando pido "un poco de ayuda sobre cómo configurar": básicamente, necesito devolver el control a la escena principal para permitir que el usuario cancele el guión, o monitorear de otra manera que esta pasando. Así que me gustaría "engendrar" el proceso que ejecuta ese script (es decir, tener algún tipo de ''proceso de ejecución libre''), pero aún obtener el resultado de él. (No estaba muy claro sobre eso en mi pregunta inicial).
La técnica que estoy usando aquí (ver a continuación) es hacer un waitFor en el proceso, pero por supuesto esto significa que el diálogo / Scene está ''colgado'' mientras se ejecuta el script. Me gustaría recuperar el control, pero ¿cómo paso la ''p'' (Proceso) a otra pieza del controlador (o, como alternativa, simplemente inicie ese otro proceso pasando los parámetros para iniciar el script y hacer que inicie el guión? ) que luego hará la actualización automática, a través del enlace que menciona Sergey Grinev, sin "colgar" la escena / ventana? Además, ¿puedo ''detener'' este otro proceso si el usuario lo solicita?
Aquí está mi código actual (''espera'' mientras el script --que tarda de 20 a 40 minutos en ejecutarse! - completa; esto no es lo que quiero, me gustaría que el control se devuelva al usuario):
public class MyController implements Initializable {
@FXML
private void handleRunScript(ActionEvent event) throws IOException {
ProcessBuilder pb = new ProcessBuilder("myscript.sh", "arg1", "arg2", ...);
Process p = pb.start();
try {
BufferedReader bri = new BufferedReader
(new InputStreamReader(p.getInputStream()));
String line;
while ((line = bri.readLine()) != null) {
System.out.println(line);
textAreaRight.setText(line);
}
bri.close();
p.waitFor();
}
catch (Exception err) {
err.printStackTrace();
}
}
@FXML
private void handleCancel(ActionEvent event) {
doSomethingDifferent();
}
}