Tenho aprendido JavaFX nas últimas semanas. Aqui está uma visão geral de alto nível de como ele se compara ao WPF aos meus olhos:
Todos os meus comentários estão relacionados ao JavaFX 2.0. Essas informações provavelmente estarão sujeitas a alterações, pois a plataforma ainda é bastante imatura e está sendo ativamente desenvolvida.
Gráficos
Como o WPF, o JavaFX usa um sistema de renderização de gráficos retido. A interface do usuário compreende um grafo de cena composto de 'nós' que podem ser conceitualmente semelhantes aos WPFs UIElement
.
O JavaFX descarregará a renderização gráfica para a GPU, se disponível. O sistema gráfico usa DirectX no Windows e OpenGL em outras plataformas.
Markup
As interfaces de usuário JavaFX podem ser criadas em código e por meio de marcação FXML, que é semelhante ao XAML no sentido de que o gráfico de objeto pode ser criado aninhando elementos.
FXML tem alguns recursos semelhantes ao XAML, como associação de propriedade (somente expressões simples) e associação a manipuladores de eventos (qualquer método onEvent ). Os manipuladores de eventos podem ser declarados in-line, mas normalmente você ligaria a um evento no controlador associado.
Os arquivos FXML podem ter um controlador associado que permite declarar manipuladores de eventos complexos e definir ligações entre propriedades. Este é um controlador no sentido MVC e não é o mesmo que um viewModel no mundo WPF (normalmente, um controlador terá referências a nós e controles).
Uma diferença para o WPF é que parece que o FXML não é compilado em uma representação binária intermediária como o BAML. Não notei nenhum problema de desempenho ainda, mas não usei o sistema extensivamente. No entanto, observei que FXML geralmente tende a ser mais curto do que qualquer XAML, pois a plataforma ainda incentiva você a escrever código e os estilos são declarados separadamente.
Uma introdução ao FXML pode ser encontrada aqui .
Um construtor de cena é fornecido gratuitamente (como na cerveja), portanto, se você não gosta de codificar manualmente a IU, pode arrastar e soltar elementos, definir propriedades e vincular ao código em seu controlador e o FXML será gerado automaticamente. Obviamente, o criador de cena não é nem de longe tão poderoso quanto o Expression Blend, mas ainda é melhor do que o 'designer' fornecido pelo Visual Studio.
Obrigatório
JavaFX tem um sistema de propriedade e ligação muito poderoso. O padrão Java Bean foi estendido para incluir classes que encapsulam uma propriedade (semelhante à maneira como as propriedades de dependência WPF representam propriedades). Essas classes implementam interfaces que fornecem notificação de invalidação e alteração.
Há uma distinção entre notificações de invalidação e notificações de mudança. As invalidações apenas informam que a expressão de vinculação agora é inválida e precisa ser recalculada; o recálculo não ocorre de fato até que você solicite o valor da propriedade por meio de seus métodos get()
ou getValue()
. Se você registrou um ouvinte de alteração, no entanto, a expressão será reavaliada imediatamente e tudo o que estiver vinculado a essa propriedade refletirá as alterações.
O JavaFX expõe essas propriedades de maneira semelhante ao WPF com uma propriedade get e set e um método que retorna uma instância do wrapper de propriedade (que não são estáticos como as propriedades WPF).
Ligações complexas podem ser criadas entre várias propriedades. Quer que uma propriedade inteira seja a soma de duas outras (a = b + c)? Não há problema, o JavaFX fornece uma API Fluent para expressar esse tipo de relacionamento EG
A. Adicionar (B, C);
Se o valor de B ou C mudar, as notificações apropriadas serão levantadas para que o sistema saiba que A precisa ser reavaliado. Observe que, neste caso, uma exceção será lançada se você tentar definir o valor de A, pois ele está vinculado às outras propriedades, portanto, não faz sentido neste contexto.
Essas expressões podem ser bastante complexas EG a = (b + c) * (d - e)
e podem incluir qualquer número de propriedades. A API fluente é bastante fácil de ler e usar, mas não é tão boa quanto algumas APIs fluentes fornecidas por algumas bibliotecas da Microsoft, mas isso se deve mais às limitações da linguagem Java do que ao próprio JavaFX.
Podem ser criadas ligações bidirecionais simples entre propriedades do mesmo tipo para que, se uma for atualizada, a outra refletirá automaticamente a mudança.
O JavaFX também fornece uma API de baixo nível para customizar as ligações você mesmo, se desejar criar uma expressão de ligação customizada que não seja fornecida pela API ou se estiver preocupado com o desempenho.
Uma das maiores diferenças entre o JavaFX e o WPF é que as ligações são realizadas principalmente no código em JavaFX em comparação com a maneira WPF de estabelecer ligações na marcação.
Uma introdução às propriedades e ligações pode ser encontrada aqui .
Estilos
JavaFX usa CSS para alterar a aparência dos nós contidos no gráfico de cena. Há uma especificação completa disponível que explica os tipos e as propriedades que podem ser definidas em cada tipo de nó.
O JavaFX também fornece alguns acréscimos que ajudam a melhorar o CSS, como variáveis que podem ser definidas e usadas em outro lugar. EG
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
Ele também oferece algumas funções que permitem derivar cores de outras cores definidas anteriormente, o que é útil para criar coisas como gradientes. Isso significa que uma paleta de cores base pode ser definida e o resto pode ser gerado a partir desses valores (é isso que o arquivo CSS JavaFX padrão faz).
O JavaFX CSS não permite definir o tipo de layout usado por um nó (no momento da redação deste, todo o layout precisa ser executado em código). Isso funciona muito bem para mim, pois esse foi o único aspecto do CSS que realmente me incomodou ao usá-lo com HTML.
Pessoalmente, prefiro estilos CSS a XAML, que tendem a ser muito prolixos para o meu gosto.
Um guia para JavaFX CSS pode ser encontrado aqui .
Layout
O JavaFX fornece vários painéis de layout semelhantes aos fornecidos pelo WPF. Uma diferença que notei é que o contrato de medida e layout é definido mais acima na cadeia de herança na Region
classe.
Conforme mencionado anteriormente, o Layout não pode ser executado usando CSS, mas pode ser expresso usando o código, FXML ou criado usando o construtor de cena (que é finalmente convertido para FXML).
Controles
O JavaFX fornece uma biblioteca cada vez maior de controles que esperamos. Uma diferença importante entre JavaFX e WPF é que os controles são essencialmente caixas pretas e não podem ser reformulados da mesma forma que os controles WPF. Eles também parecem expor muito menos propriedades do que os controles WPF.
Os controles expõem algumas das regiões específicas de implementação para CSS, permitindo que áreas específicas de um controle sejam direcionadas por seus estilos. Isso é conhecido como subestrutura do controle. EG a CheckBox
expõe duas subestruturas; a caixa e a marca de seleção permitindo que cada parte do controle seja estilizada de forma independente. Observe que, conforme descrito anteriormente, apenas a aparência de um controle pode ser alterada usando CSS, mas a sensação não. Por exemplo, você não pode alterar drasticamente a maneira como um TabPane
apresenta seu conteúdo alterando seu painel de layout interno da maneira que você pode com o WPF TabControl
.
Embora isso pareça bastante limitante, a maneira preferida de criar controles personalizados no JavaFX parece ser usar a composição ao longo das linhas de derivar de um painel de layout para posicionar os controles padrão e remodelá-los usando CSS.
Conclusão
No geral, estou muito impressionado com o que o JavaFX tem a oferecer no momento. Embora não seja tão maduro quanto o WPF, ele está sendo desenvolvido ativamente e a Oracle certamente parece estar apoiando isso. O tempo dirá se foi bem-sucedido ou não.
Eu recomendaria dar uma chance ao JavaFX. Leia a documentação e tente montar um pequeno aplicativo para ver o que você acha.
Você também deve verificar FXExperience.com que é atualizado regularmente com informações da equipe de desenvolvimento.