Como o JavaFX se compara ao WPF? [fechadas]

93

Sou principalmente um programador C #, parei de escrever Java há cerca de 10 anos, mas tento me manter atualizado com a tecnologia em Java lendo artigos, conversando com amigos etc.

Eu ouvi sobre a nova estrutura de GUI rica chamada JavaFX, mas não consegui encontrar nenhum recurso comparando-a com paralelos não Java.

Como estou muito familiarizado com C # e WPF, gostaria de ter uma ideia sobre como as duas tecnologias são semelhantes ou diferentes.

EDITAR: Visto que não há respostas chegando, tentarei ser mais específico:

  1. WPF usa XAML para criar a árvore visual, o JavaFX tem algo semelhante?
  2. O WPF é melhor usado com vinculação a um modelo de visualização em um padrão MVVM. O JavaFX também faz uso extensivo de vinculação?
  3. O WPF utiliza a GPU para renderização, o JavaFX faz o mesmo?
  4. Como o Silverlight se compara ao JavaFX quando executado em um navegador em um net pc?

... Mais por vir ...

Estou mudando isso para wiki da comunidade para que as comparações possam continuar sendo atualizadas (espero).

Aviad P.
fonte
7
Engraçado que uma pergunta com 83 votos positivos pode ser considerada não construtiva.
kristianp

Respostas:

120

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

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 CheckBoxexpõ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 TabPaneapresenta 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.

Benjamin
fonte
9
Muito obrigado por isso, isso é muito educativo. Se você pudesse aprimorar ainda mais esta resposta à medida que avança em seu conhecimento do JavaFX, seria incrível.
Aviad P.
5
Também gostei de ler sua resposta e adoraria saber mais se seu trabalho com o JavaFX revelar mais informações.
Paul-Sebastian Manole,
21

Acho que a melhor maneira de conhecer o JavaFX é apenas experimentá-lo. Existem alguns bons tutoriais no site do JavaFX. Aqui estão algumas:

Eles são muito rápidos e dão uma boa noção do idioma. Existem muitos outros no site JavaFX se você estiver interessado em mais tutoriais e artigos.

Para respostas específicas às suas perguntas:

  1. JavaFX tem sua própria linguagem declarativa para criar a "árvore visual" que não é um derivado xml. A IU é baseada em um gráfico de cena para que você possa aplicar vários efeitos e animações a qualquer nó do gráfico. Veja os tutoriais para mais informações. Também existe uma ferramenta de designer para JavaFX (que ainda não experimentei).
  2. JavaFX tem vinculação embutida na linguagem .
  3. JavaFX na área de trabalho usa Java AWT / Swing, que usa renderização por GPU. Cada versão do Java parece descarregar mais de seus gráficos para a GPU. Chris Campbell, da Sun, escreveu um blog sobre aceleração de GPU . Não tenho certeza se a versão móvel do JavaFX tem aceleração de GPU. Descobri que as versões anteriores do JavaFX não tinham desempenho suficiente para o que eu precisava, mas sei que a versão mais recente tem melhorias significativas de desempenho em relação às versões anteriores e ainda estão trabalhando para torná-la mais rápida.
  4. JavaFx usa miniaplicativos Java para rodar no navegador. A partir da atualização 10 do Java 6, a estrutura do miniaplicativo Java foi retrabalhada e, embora não seja tão perfeita quanto o Adobe Flash, está muito melhorada. Não tenho certeza de como ele se compara ao Silverlight, mas tive problemas para fazer o Silverlight funcionar no Linux, mas fiz o JavaFX funcionar no Linux.

Aqui está outra questão relacionada .

Jay Askren
fonte
15
Esta resposta está desatualizada porque o JavaFX passou por atualizações significativas no Java 7. Veja aqui .
Zoltán
7
Tem certeza de que o JavaFX usa swing e AWT? Acredito que tenha seu próprio mecanismo de renderização chamado prisma. Nenhum encadeamento de Despacho de Evento é criado ao executar um aplicativo JavaFX.
Andy Till