Até agora ficou claro que JavaFx não pegou, não existem muitas aplicação “de verdade” rodando, e só entusiastas mesmo tem construído algo. Nesse batalha de RIA parece que o Adobe AIR realmente largou na frente.
No meio de minha segunda aplicação na tecnologia, resolvi fazer essa análise, com vantagens, desvantagens e considerações.
Vou começar pela vantagem mais óbvia: É Java. Ou melhor, roda na JVM e pode ser escrito em Java. Isso quer dizer que se o JavaFx não supre algum requisito do aplicativo, você pode “descer” para java nessa parte. Isso implica também que você pode fazer uso de uma comunidade gigantesca que disponibiliza milhares de bibliotecas para completar sua aplicação. Além é claro dos recursos e classes da JRE.
Aplicações JavaFx podem ser lançadas como applets ou através do Java WebStart. Lançando como applet você ainda tem a opção de arrastar o applet para fora do browser para te-lo como uma app independente. Ambos os modos permitem criar um icone na área de trabalho para o aplicativo.
Isso levanta a questão óbivia de performace: No geral o tempo de carregamento tanto de um applet como do JWS é um pouco lento, o startup da JVM ainda é um pouco lento. Mas após lançado o aplicativo a performace é muito boa, e o consumo de memória não é o monstro que todos esperam do Java, com alguns cuidados é possível manter o usso de memoria baixo, mais até que Apps em Adobe Air, por exemplo.
Falando em recursos da JVM, o primeiro grande problema em JavaFx é que é “Single Threaded”, isso quer dizer que toda sua aplicação roda em uma Thread só, na EDT (na interface). E o único meio de usar threads é recorrendo a Java. Algumas classes do JavaFx internamente rodam em threads, como HTTP, mas se você quer criar threads, a classe da thread será feita em Java. O JavaFX tem classes para thread próprias, mas tem quer alidas a classes java.
Resumindo, se quer thread use as classes de Java (como Timer) ou crie as classes usando Java e as classes async do JavaFx.
E qual a diferença entre escrever em Java e JavaFx? A linguagem usada no JavaFx é o javafx script, é uma linguagem híbrida entre Orientação a Objetos e Funcional (mas bem mais OO que funcional), com uma sintaxe declarativa. Isso quer dizer que: É uma ótima sintaxe. É bem mais flexível, mais enxuta e de leitura fácil, lembra muito JSon(e javascript), mas é bem diferente. Tem funções como classes de primeiro nível e variáveis finais.
Você pode receber uma função(definida pela assinatura) como parâmetro. Tem ainda os “bind”, que permitem conectar duas ou mais variáveis, com ou sem reciprocidade. Quando você “bind” uma variável a outra é como se cadastrasse um Listener para quando esta mudar, o outra é atualizada. Você pode ainda disparar eventos quando o conteúdo de uma variável é alterado.
Isso tudo torna a linguagem muito boa para criação de interface gráfica, e aí esta a maior vantagem do JavaFx: É focado em interfaces. Não posso nem comparar ao swing ou mesmo mesmo swt, é muito mais fácil e flexível. Você pode usar ferramentas gráficas, pode usar o inkscape por exemplo, é bem fácil fazer os elementos da forma e cor que quiser, e adicionar funções a eles. Além, é claro, de contar com os controles mais comuns. Efeitos, transições, animações e layouts não faltam. E, aceita CSS em vários níveis.
Bom, ai esta um grande problema na verdade: Ainda faltam muitos componentes “comuns”, como por exemplo a absurda ausência de campos para password e selects drop down. O workaround (ou gambiarra) é que é possivel fazer o “wrap” de componentes swing, o que é feio. Não são muitos elementos que faltam, mas esses dois são uma grande decepção.
Mas isso também demonstra que o JavaFx traz utilitários para várias tarefas comuns à aplicativos conectados, por exemplo: o RssTask (e AtomTask) que atualiza a aplicação a cada atualização dos mesmo, verificando em períodos definidos, tem parsers para Json e Xml bem fáceis de usar, baseados em SAX. O utilitário de HTTP também é muito bom, gráficos tem de montão, além de media, incluindo um conversor de diversos formatos. Além de uma API de persistência para os dados da aplicação.
Enfim, na minha opinião, JavaFX é uma tecnologia muito boa mas ainda imatura. Claro que, principalmente por pode recorrer ao Java, pode ser usado em aplicações “reais”, mas ainda tem muito o que implementar e corrigir. Nos aplicativos que fiz costumo deixar tudo sobre fluxos e telas ao JavaFx, e nas próprias classes do JavaFx usar as classes Java para certos trabalhos, como threading e pools.
Para terminar, confiram alguns links legais, para conferir algumas aplicações:
- Music Explorer Fx (link do aplicativo direto)
- Real Track Car Race (link do aplicativo direto)
- Database tools (página do projeto) Para se conctar a banco de dados, com várias funções.
- TwitterFX (página do projeto) Bom cliente twitter feito em JavaFx
- Cliente para o TOP (blog post)
- Cliente para Webservices (blog post)
- Project Management System (página de exemplos)
- Brick Breaker (página de exemplos)
- JFXtras (página do projeto) biblioteca de utlitários para JavaFx
- Widgetfx (página do projeto) Widgets container em JavaFx
- E, é claro, TwitterFlow (página do projet) Meu cliente twitter em progresso