Ho imparato JavaFX nelle ultime due settimane. Ecco una panoramica di alto livello di come si confronta con WPF ai miei occhi:
Tutti i miei commenti sono relativi a JavaFX 2.0. Queste informazioni saranno probabilmente soggette a modifiche poiché la piattaforma è ancora abbastanza immatura e viene attivamente sviluppata.
Grafica
Come WPF, JavaFX utilizza un sistema di rendering grafico mantenuto. L'interfaccia utente comprende un grafico di scena composto da "nodi" che possono essere considerati concettualmente simili a quelli di WPF UIElement
.
JavaFX scaricherà il rendering grafico sulla GPU, se disponibile. Il sistema grafico utilizza DirectX su Windows e OpenGL su altre piattaforme.
Markup
Le interfacce utente JavaFX possono essere create sia nel codice che tramite il markup FXML che è simile a XAML in quanto l'oggetto grafico può essere creato annidando elementi.
FXML ha alcune caratteristiche simili a XAML come l'associazione di proprietà (solo espressioni semplici) e l'associazione a gestori di eventi (qualsiasi metodo onEvent ). I gestori di eventi possono essere dichiarati in linea ma in genere ci si associa a un evento nel controller associato.
I file FXML possono avere un controller associato che consente di dichiarare gestori di eventi complessi e di impostare associazioni tra proprietà. Questo è un controller nel senso MVC e non è la stessa cosa di un viewModel nel mondo WPF (in genere un controller avrà riferimenti a nodi e controlli).
Una differenza rispetto a WPF è che sembra che FXML non sia compilato in una rappresentazione binaria intermedia come BAML. Non ho ancora notato problemi di prestazioni ma non ho utilizzato ampiamente il sistema. Tuttavia, ho notato che FXML di solito tende ad essere più corto di qualsiasi XAML poiché la piattaforma ti incoraggia ancora a scrivere codice e gli stili sono dichiarati separatamente.
Un'introduzione a FXML può essere trovata qui .
Un generatore di scene è fornito gratuitamente (come nella birra), quindi se non ti piace la codifica manuale dell'interfaccia utente puoi trascinare e rilasciare elementi, impostare proprietà e associare al codice nel tuo controller e FXML verrà generato automaticamente. Ovviamente il generatore di scene non è neanche lontanamente potente come Expression Blend, ma è comunque migliore del "designer" fornito da Visual Studio.
Rilegatura
JavaFX ha una proprietà e un sistema di binding molto potenti. Il pattern Java Bean è stato esteso per includere classi che incapsulano una proprietà (simile al modo in cui le proprietà di dipendenza WPF rappresentano le proprietà). Queste classi implementano interfacce che forniscono l'invalidazione e la notifica delle modifiche.
Esiste una distinzione tra notifiche di invalidamento e notifiche di modifica. Gli annullamenti indicano solo che l'espressione di associazione ora non è valida e deve essere ricalcolata; il ricalcolo non si verifica effettivamente fino a quando non si richiede il valore della proprietà tramite i suoi metodi get()
o getValue()
. Se hai registrato un listener di modifiche, tuttavia, l'espressione verrà rivalutata immediatamente e tutto ciò che è associato a quella proprietà rifletterà le modifiche.
JavaFX espone queste proprietà in modo simile a WPF con una proprietà get e set e un metodo che restituisce un'istanza del wrapper di proprietà (che non sono statiche come le proprietà WPF).
È possibile creare associazioni complesse tra più proprietà. Vuoi che una proprietà intera sia la somma di altre due (a = b + c)? Nessun problema, JavaFX fornisce un'API fluente per esprimere questo tipo di relazioni, ad es
A. Aggiungi (B, C);
Se il valore di B o C cambia, verranno sollevate le notifiche appropriate in modo che il sistema sappia che A deve essere rivalutato. Si noti che in questo caso, verrà generata un'eccezione se si tenta di impostare il valore di A poiché è associato alle altre proprietà, quindi non ha senso in questo contesto.
Queste espressioni possono essere abbastanza complesse, ad esempio, a = (b + c) * (d - e)
e possono includere un numero qualsiasi di proprietà. L'API fluente è abbastanza facile da leggere e utilizzare, ma non è piacevole come alcune delle API Fluent fornite da alcune delle librerie Microsoft, ma questo dipende più dalle limitazioni del linguaggio Java piuttosto che dallo stesso JavaFX.
È possibile creare semplici associazioni bidirezionali tra proprietà dello stesso tipo in modo che, se una viene aggiornata, l'altra rifletta automaticamente la modifica.
JavaFX fornisce anche un'API di basso livello per personalizzare i collegamenti da soli se si desidera creare un'espressione di associazione personalizzata non fornita dall'API o se si è preoccupati per le prestazioni.
Una delle maggiori differenze tra JavaFX e WPF è che i collegamenti vengono eseguiti principalmente nel codice in JavaFX rispetto al modo WPF di stabilire i collegamenti nel markup.
Un'introduzione alle proprietà e alle associazioni può essere trovata qui .
Stili
JavaFX utilizza i CSS per modificare l'aspetto dei nodi contenuti nel grafico della scena. È disponibile una specifica completa che spiega i tipi e le proprietà che possono essere impostate su ciascun tipo di nodo.
JavaFX fornisce anche alcune aggiunte che aiutano a migliorare CSS come le variabili che possono essere definite e utilizzate altrove EG
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
Fornisce anche un paio di funzioni che consentono di derivare colori da altri colori definiti in precedenza, il che è utile per creare cose come i gradienti. Ciò significa che è possibile definire una tavolozza di colori di base e il resto può essere generato da questi valori (questo è ciò che fa il file CSS JavaFX predefinito).
JavaFX CSS non consente di definire il tipo di layout utilizzato da un nodo (al momento della stesura di questo tutto il layout deve essere eseguito in codice). Questo funziona molto bene per me in quanto questo era l'unico aspetto del CSS che mi ha davvero causato dolore quando lo si utilizza con HTML.
Personalmente preferisco gli stili CSS rispetto a XAML che tendono ad essere troppo prolissi per i miei gusti.
Una guida a JavaFX CSS può essere trovata qui .
disposizione
JavaFX fornisce una serie di riquadri di layout simili a quelli forniti da WPF. Una differenza che ho notato è che il contratto di misura e layout è definito più in alto nella catena di ereditarietà nella Region
classe.
Come accennato in precedenza, il layout non può essere eseguito utilizzando CSS ma può essere espresso utilizzando il codice, FXML o creato utilizzando il generatore di scene (che viene infine convertito in FXML).
Controlli
JavaFX fornisce una libreria di controlli in continua crescita che ci aspettiamo. Una delle principali differenze tra JavaFX e WPF è che i controlli sono essenzialmente scatole nere e non possono essere reimpostati nel modo in cui possono fare i controlli WPF. Inoltre sembrano esporre molte meno proprietà rispetto ai controlli WPF.
I controlli espongono alcune delle regioni specifiche dell'implementazione ai CSS, consentendo ad aree specifiche di un controllo di essere mirate ai tuoi stili. Questa è nota come sottostruttura del controllo. EG a CheckBox
espone due sottostrutture; la casella e il segno di spunta che consentono di assegnare uno stile indipendente a ciascuna parte del controllo. Si noti che, come descritto in precedenza, solo l' aspetto di un controllo può essere modificato utilizzando i CSS ma la sensazione no. Ad esempio, non è possibile alterare drasticamente il modo in cui a TabPane
presenta il suo contenuto alterando il suo pannello di layout interno nel modo in cui è possibile con WPF TabControl
.
Anche se questo suona abbastanza limitante, il modo preferito per creare controlli personalizzati in JavaFX sembra usare la composizione sulla falsariga di derivare da un pannello di layout per posizionare i controlli standard e ridisegnarli usando CSS.
Conclusione
Nel complesso, sono molto impressionato da ciò che JavaFX ha da offrire al momento. Anche se non è neanche lontanamente maturo come WPF, viene sviluppato attivamente e Oracle sembra certamente appoggiarlo. Il tempo ci dirà se avrà successo o meno.
Consiglierei di provare JavaFX. Leggi la documentazione e prova a mettere insieme una piccola applicazione e guarda cosa ne pensi.
Dovresti anche controllare FXExperience.com che viene aggiornato regolarmente con le informazioni del team di sviluppo.