2009-02-09 13 views
7

Esiste un modo per imporre a un'app JavaFX di ridisegnarsi prima di procedere? Simile al metodo di un pannello di Swing (grafica g) (potrei avere le parole chiave sbagliate lì).Forza vernice immediata in JavaFX

Considerare il seguente esempio: si scrive un'app TicTacToe insieme all'IA richiesta per un lettore di computer. Vorresti la possibilità di mostrare a due giocatori di computer la causa. Forse fai una pausa di due secondi tra i giri del computer per dargli un effetto di vita. Quando premi il pulsante "Vai", c'è una grande pausa di non risposta (il tempo necessario per i 9 turni di andare avanti con le pause fake per il computer di "decidere") e poi improvvisamente l'immagine dell'app viene aggiornata con il completamento stato del gioco.

Sembra che JavaFX riduca una volta che l'elaborazione nel thread dell'applicazione è terminata? Non sono completamente sicuro qui.

Grazie!

+0

Credo che Swing e JavaFX abbiano un modello di threading simile in quei componenti della GUI, ad es. JPanel di Swing, pulsante JavaFx, dovrebbe essere aggiornato solo dal thread principale. Nel tuo esempio precedente creerai dei fili separati che eseguono i calcoli, quindi muoiono e poi chiamo o Swing.invokeLater o Platform.runLater() per ottenere il thread principale per aggiornare la GUI. Mentre questo suona strano è fatto in questo modo per aggirare i problemi che si sarebbero verificati se qualsiasi thread fosse autorizzato ad aggiornare la GUI. – Kerry

risposta

6

Hai ragione. JavaFX è guidato dagli eventi e single-threaded. Ciò significa che il repaint e la risposta all'evento non possono essere eseguiti contemporaneamente. L'attività a esecuzione prolungata deve essere eseguita su un thread separato in modo che non blocchino il rendering dell'interfaccia utente. Quando l'attività è terminata, può sincronizzarsi sul thread FX chiamando FX.deferAction() che eseguirà semplicemente il codice sul main filo.

1

Questa non sarà la risposta più utile in quanto mi sono divertito con JavaFX per tutta la mezza giornata, ma non useresti Timeline, fotogrammi chiave e associazione per realizzare i tuoi ripetitori invece di chiamarli esplicitamente come te hai descritto?

Vedere this tutorial for an example.

1

Il modello di JavaFX è quello di separarti dal dipinto della "roba" sullo schermo. Questo è molto potente, ma è un cambiamento da come potresti avere familiarità.

whaley è corretto che il modo appropriato di farlo in JavaFX è di creare una linea temporale in cui lo spostamento viene eseguito ogni X secondi e verrà disegnato in quel fotogramma chiave.

Se hai una domanda su come farlo, prova e fai una nuova domanda con un po 'di codice.