Come si confronta JavaFX con WPF? [chiuso]


93

Sono principalmente un programmatore C #, ho smesso di scrivere Java circa 10 anni fa, ma cerco di stare al passo con la tecnologia in Java leggendo articoli, parlando con gli amici, ecc.

Ho sentito parlare del nuovo ricco framework GUI chiamato JavaFX, ma non sono riuscito a trovare alcuna risorsa confrontandolo con paralleli non Java.

Dato che ho molta familiarità con C # e WPF, mi piacerebbe avere un'idea di quanto siano simili o diverse le due tecnologie.

EDIT: Visto che non ci sono risposte in arrivo, cercherò di essere più specifico:

  1. WPF utilizza XAML per creare la struttura ad albero visuale, JavaFX ha qualcosa di simile?
  2. WPF viene utilizzato al meglio con l'associazione a un modello di visualizzazione in un pattern MVVM, JavaFX fa anche un ampio uso dell'associazione?
  3. WPF utilizza la GPU per il rendering, JavaFX fa lo stesso?
  4. Come si confronta Silverlight con JavaFX quando viene eseguito tramite un browser su un PC in rete?

... E c'è dell'altro...

Sto cambiando questo in wiki della comunità in modo che i confronti possano continuare ad essere aggiornati (si spera).


7
Divertente che una domanda con 83 voti positivi possa essere considerata non costruttiva.
kristianp

Risposte:


120

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 Regionclasse.

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 CheckBoxespone 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 TabPanepresenta 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.


9
Grazie mille per questo, è molto istruttivo. Se potessi migliorare ulteriormente questa risposta man mano che avanzi nella tua conoscenza di JavaFX, sarebbe fantastico.
Aviad P.

5
Mi è piaciuto anche leggere la tua risposta e mi piacerebbe saperne di più se il tuo lavoro con JavaFX rivela ulteriori approfondimenti.
Paul-Sebastian Manole

21

Penso che il modo migliore per avere un'idea di JavaFX sia semplicemente provarlo. Ci sono alcuni buoni tutorial sul sito Web JavaFX. Eccone un paio:

Sono piuttosto veloci e ti danno una buona sensazione per la lingua. Ce ne sono molti altri sul sito JavaFX se sei interessato a più tutorial e articoli.

Per risposte specifiche alle tue domande:

  1. JavaFX ha un proprio linguaggio dichiarativo per creare "l'albero visivo" che non è un derivato xml. L'interfaccia utente si basa su un grafico di scena in modo da poter applicare vari effetti e animazioni a qualsiasi nodo nel grafico. Vedere i tutorial per ulteriori informazioni. C'è anche uno strumento di progettazione per JavaFX (che non ho ancora provato).
  2. JavaFX ha l'associazione incorporata nel linguaggio .
  3. JavaFX sul desktop utilizza Java AWT / Swing che utilizza il rendering GPU. Ogni versione di Java sembra scaricare più della sua grafica sulla GPU. Chris Campbell di Sun ha scritto sul suo blog qualcosa sull'accelerazione GPU . Non sono sicuro che la versione mobile di JavaFX abbia l'accelerazione GPU. Ho scoperto che le versioni precedenti di JavaFX non erano abbastanza performanti per ciò di cui avevo bisogno, ma so che l'ultima versione ha miglioramenti significativi delle prestazioni rispetto alle versioni precedenti e stanno ancora lavorando per renderla più veloce.
  4. JavaFx utilizza applet Java per essere eseguito nel browser. A partire dall'aggiornamento 10 di Java 6, il framework dell'applet Java è stato rielaborato e sebbene non sia fluido come Adobe Flash, è molto migliorato. Non sono sicuro di come si paragoni a Silverlight a parte il fatto che ho avuto problemi a far funzionare Silverlight su Linux, ma JavaFX funzionava su Linux.

Ecco un'altra domanda correlata .


15
Questa risposta è obsoleta poiché JavaFX ha subito aggiornamenti significativi in ​​Java 7. Vedi qui .
Zoltán

7
Sei sicuro che JavaFX utilizzi swing e AWT? Credo che abbia il suo motore di rendering chiamato prisma. Nessun thread di invio eventi viene creato durante l'esecuzione di un'app JavaFX.
Andy fino al
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.