2013-05-23 14 views
10

Ho un problema mentre lavoro con JavaFX e Thread. Fondamentalmente ho due opzioni. Lavorare con Tasks o Perform.runLater. Come ho capito Perform.runLater dovrebbe essere usato per compiti semplici/corti, mentre Task per quelli più lunghi. Tuttavia, non posso usare nessuno di loro. Quando chiamo Thread deve apparire una finestra di dialogo captcha in mezzo al compito. Durante l'uso di Task, ignora la mia richiesta di mostrare una nuova finestra di dialogo ... Non mi permette di creare un nuovo stage. D'altra parte, quando uso lo Platform.runLater mi consente di visualizzare una finestra di dialogo, tuttavia, una finestra del programma si blocca fino a quando viene visualizzata una finestra di dialogo a comparsa. Ho bisogno di qualsiasi tipo di soluzione per questo. Se qualcuno sa come gestire questo o ha avuto esperienze simili e ha trovato una soluzione, non vedo l'ora di sentirti!JavaFX che funziona con thread e GUI

+0

possibile duplicato di [JavaFX2:? Posso mettere in pausa uno sfondo Compito/servizio] (http://stackoverflow.com/questions/14941084/javafx2-can-i- pause-a-background-task-service) – jewelsea

risposta

25

Come puce dice, è necessario utilizzare Task o Service per le cose che devi fare in background. E Platform.runLater fare le cose nel thread dell'applicazione JavaFX dal thread in background.

È necessario sincronizzarli e uno dei modi per farlo è utilizzare la classe CountDownLatch.

Ecco un esempio:

Service<Void> service = new Service<Void>() { 
     @Override 
     protected Task<Void> createTask() { 
      return new Task<Void>() {   
       @Override 
       protected Void call() throws Exception { 
        //Background work      
        final CountDownLatch latch = new CountDownLatch(1); 
        Platform.runLater(new Runnable() {       
         @Override 
         public void run() { 
          try{ 
           //FX Stuff done here 
          }finally{ 
           latch.countDown(); 
          } 
         } 
        }); 
        latch.await();      
        //Keep with the background work 
        return null; 
       } 
      }; 
     } 
    }; 
    service.start(); 
+0

Esattamente quello che stavo cercando. Grazie mille! – ksarunas

6

Utilizzare un Worker (Task, Service) dal thread Applicazione JavaFX se si desidera eseguire qualcosa in background.

http://docs.oracle.com/javafx/2/api/javafx/concurrent/package-summary.html

Usa Platform.runLater da un thread in background, se si vuole fare qualcosa sul filo JavaFX Application.

http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater%28java.lang.Runnable%29

+0

Creo un lavoratore (attività). Una volta che ho bisogno di mostrare un pop up, chiamo Platform.runLater, ma ho bisogno di aspettare la risposta (è una finestra di dialogo di input), ma se creo un nuovo thread (Platform.runLater) non aspetta la risposta e Worker continua ... Come affrontarlo Forse c'è un modo per mettere in pausa il thread Worker attendere input da Platform.runLater e poi continuare ...? – ksarunas

Problemi correlati