Javafx

70
CENTRO UNIVERSITÁRIO DE MARINGÁ CURSO DE PÓS-GRADUAÇÃO EM DESENVOLVIMENTO ORIENTADO A OBJETOS - JAVA Márcio Mitsunori Noda JavaFX: Implementação na Prática MARINGÁ 2009

description

javafx

Transcript of Javafx

Page 1: Javafx

CENTRO UNIVERSITÁRIO DE MARINGÁ

CURSO DE PÓS-GRADUAÇÃO EM DESENVOLVIMENTO ORIENTADO A

OBJETOS - JAVA

Márcio Mitsunori Noda

JavaFX: Implementação na Prática

MARINGÁ 2009

Page 2: Javafx

Márcio Mitsunori Noda

JavaFX

MARINGÁ 2009

Monografia apresentada ao Centro Universitário de Maringá como requisito para obtenção do título de especialista em Desenvolvimento Orientado a Objetos -JAVA, sob orientação do prof. Munif Gebara Junior.

Page 3: Javafx

AGRADECIMENTOS

Aos meus pais por todo incentivo, apoio e confiança.

Ao professor Munif Gebara Junior, meu orientador, obrigado por toda

sua atenção e dedicação, e principalmente pela motivação que se mostraram

indispensáveis a este trabalho.

Em especial, ao meu primo Fabrício que colaborou com o papel de

leiautista no desenvolvimento deste trabalho.

Page 4: Javafx

RESUMO

JavaFX sendo uma tecnologia recente, desenvolvida com a finalidade de

implementação de interfaces ricas (RIA – Rich Internet Application), ainda não

consolidada no mercado, no presente trabalho será avaliado os custos em tempo,

trabalho requerido, desempenho em produção e complexidade no desenvolvimento

de pequenos exemplos práticos sob a plataforma.

Por seguinte, submeter tais implementações em testes de execução sob as

plataformas, browser (navegador), desktop e em dispositivos móveis, tal como

divulgado pelo fornecedor.

Palavras-chave: JavaFX , RIA.

Page 5: Javafx

LISTA DE FIGURAS

Figura 1. Primeiro Projeto .................................................................................................... 34 Figura 2. Primeiro Projeto sob os dispositivos HTC ........................................................... 35 Figura 3. Projeto Calculadora nos dispositivos HTC ........................................................... 36 Figura 4. Calculadora ........................................................................................................... 39 Figura 5. Projeto Agenda sob os dispositivos HTC ............................................................. 40 Figura 6. Agenda .................................................................................................................. 41

Page 6: Javafx

LISTA DE TABELAS

Tabela 1. Temas RIA ............................................................................................................ 16 Tabela 2. Comparação dentre desktop, web e RIA .............................................................. 18 Tabela 3. Classificação dos tipos de RIA ............................................................................. 19 Tabela 4. Recursos de destaque do JavaFX ......................................................................... 26 Tabela 5. Formas de implantação ......................................................................................... 29

Page 7: Javafx

9

LISTA DE QUADROS

Quadro 1. Controle contra travamentos. ............................................................................ 32 Quadro 2. Código fonte do Primeiro Projeto ..................................................................... 34 Quadro 3. Classe Java Calculadora ................................................................................... 37 Quadro 4. Trecho de código da classe InterfacePadraoView ........................................... 37 Quadro 5. Trecho de código da classe Controller ............................................................. 38 Quadro 6. Conteúdo XML retornado pelo servidor .......................................................... 40 Quadro 7. Arquivo ManutencaoContatoView_en_US.fxproperties.................................. 42 Quadro 8. Trecho de código da classe ManutencaoContatoView ..................................... 43 Quadro 9. Trecho de código da classe BaseDeDados ...................................................... 43 Quadro 10. Trecho de código da classe RequisicaoServidor ............................................. 45

Page 8: Javafx

10

SUMÁRIO

AGRADECIMENTOS ............................................................................................................... 1 RESUMO ................................................................................................................................... 2 LISTA DE FIGURAS ................................................................................................................ 3 LISTA DE TABELAS ............................................................................................................... 4 LISTA DE QUADROS .............................................................................................................. 9 SUMÁRIO ................................................................................................................................ 10 1. INTRODUÇÃO ................................................................................................................ 11

1.1. Objetivos ................................................................................................................... 12 1.2. Metodologia .............................................................................................................. 13 1.3. Organização do Trabalho.......................................................................................... 13

2. Revisão Bibliográfica ....................................................................................................... 15 2.1. Rich Internet Application - RIA ............................................................................... 15 2.2. Tecnologias Similares .............................................................................................. 19 2.3. Breve Histórico da Evolução do JavaFX .................................................................. 20 2.4. JavaFX 1.0 ................................................................................................................ 21 2.5. JavaFX 1.1 ................................................................................................................ 22 2.6. JavaFX 1.2 ................................................................................................................ 22 2.7. JavaFX TV ................................................................................................................ 23 2.8. JavaFX Mobile ......................................................................................................... 23 2.9. JavaFX Script ........................................................................................................... 24 2.10. Divisão por Perfis ................................................................................................. 25 2.11. Colaboração entre Designers e Desenvolvedores ................................................. 27 2.12. Implantação .......................................................................................................... 28 2.13. Java Sandbox ........................................................................................................ 30

3. Desenvolvimento JavaFX ................................................................................................. 32 3.1. Primeiro Projeto ........................................................................................................ 33 3.2. Projeto Calculadora .................................................................................................. 35

3.2.1. Integração com Java ......................................................................................... 36 3.3. Projeto Agenda ......................................................................................................... 39

3.3.1. Lado servidor .................................................................................................... 40 3.3.2. Lado cliente ...................................................................................................... 41 3.3.3. Internacionalização ........................................................................................... 41 3.3.4. Persistência de dados ........................................................................................ 43 3.3.5. Integração ......................................................................................................... 44

4. CONCLUSÕES e TRABALHOS FUTUROS ................................................................. 47 5. REFERÊNCIAS ............................................................................................................... 50 6. BIBLIOGRAFIA CONSULTADA .................................................................................. 55 7. APÊNDICES .................................................................................................................... 56

7.1. APÊNDICE A - Código Fonte do primeiro exemplo ............................................... 57 7.2. APÊNDICE B – Código fonte da classe InterfacePadraoView ............................... 58 7.3. APÊNDICE C – Código fonte da classe Controller ................................................. 61 7.4. APÊNDICE D – Código fonte da classe ManutencaoContatoView ....................... 65 7.5. APÊNDICE E – Código fonte da classe BaseDeDados ........................................... 68 7.6. APÊNDICE F – Código fonte da classe RequisicaoServidor .................................. 70

8. ANEXOS .......................................................................................................................... 72

Page 9: Javafx

11

1. INTRODUÇÃO

A plataforma JavaFX, recente tecnologia lançada pela Sun Microsystems

para o desenvolvimento de interfaces ricas e interativas, oferece conteúdos

expressivos para browsers (navegadores), desktops, dispositivos móveis, televisores

e futuramente para outras plataformas, que poderá englobar desde aplicações

embarcadas em automóveis até em sistemas de jogos eletrônicos, unificando o

desenvolvimento e implantação de modelos de interfaces mais expressivos.

Seguindo o mesmo slogan criado pela Sun Microsystem, "write once, run anywhere"

(“escreva uma vez, execute em qualquer lugar”), promete a realização no futuro,

onde os consumidores poderão acessar o mesmo conteúdo em diversas plataformas

que suportem Java (SUN, 2007a, 2009a, 2009b).

Devido ao ambiente de execução bastante diversificado, mesmo que em

algumas plataformas liberado no momento apenas como early access, i.e., o acesso

antecipado ao produto antes da versão final ser efetivamente disponibilizada ao

público geral, pode ser considerada uma das plataformas RIA mais amplamente

disponível para implantação no mercado, abrangendo todos os grandes principais

consumidores e sistemas operacionais corporativos (SUN, 2009b, 2009g).

Como parte desta tecnologia, foi introduzido o JavaFX Script, uma nova

linguagem de programação simples e intuitiva, semelhante ao Java, que possui a

vantagem de execução sob a JRE (Java Runtime Environment), pelo o qual poderá

garantir a segurança e a onipresença da plataforma Java, apoiando todos os

conteúdos e aplicações atualmente disponíveis através dos bilhões de dispositivos

em uso hoje. O JavaFX Script é a única tecnologia que oferece uma estreita

integração com componentes Java que pode ser executado tanto em servidores

como em clientes, resultando em uma rica experiência end-to-end (fim a fim) (SUN,

2007a, 2007c).

Entre as muitas inovações do JavaFX é a característica denominada Drag-

to-Install (“soltar para instalar”), pelo o qual permite que usuários finais possam pela

primeira vez efetuar a operação de drag-and-drop (literalmente, arrastar e soltar)

para a instalação de aplicações JavaFX. Em outras palavras possibilita que

programas JavaFX que estejam em execução no navegador web como applets,

Page 10: Javafx

12

sejam movidos diretamente para a área de trabalho (desktop), proporcionado aos

usuários a mais simples experiência de instalação de softwares de Internet e

conteúdo (SUN, 2008a).

Atualmente o JavaFX ganhou um significante papel no mercado alcançando

a marca de mais de 250 milhões de instalações do JRE, e 400 mil downloads do

SDK (Software Development Kit) desde dezembro de 2008 (SUN, 2009b).

Outro ponto de destaque está no conteúdo criativo, desempenhado por

designers, responsáveis pela função artística, a possibilidade de se tornarem

também desenvolvedores Java, devido ao fácil e rápido processo de construção de

interfaces ricas, que requer menos codificação, e incluem componentes de

visualização de dados e aplicações de inteligência de negócios (MAREJKA, 2007;

SUN, 2009b, 2007a).

Atualmente pode ser considerado competitivo ou superior as soluções

similares presentes no mercado para o desenvolvimento de GUI (Graphic User

Interface) tais como o: Macromedia Flash/Flex/Open Laszlo, Adobe Apollo, Microsoft

WPF/XAML, Mozilla XUL, AJAX/DHMTL e entre outros (OLIVER, 2006).

No seu ambiente de desenvolvimento incluem o compilador, ferramentas de

runtime para várias arquiteturas de PC (Personal Computer) e outros dispositivos

como gráficos, mídia, Web Services e bibliotecas para construção de interfaces

ricas, dentre outras ferramentas necessárias para a implementação da tecnologia.

Possui plugins para ambos os IDEs (Integrated Development Environment) mais

conhecidos, NetBeans e Eclipse (SUN, 2008a).

1.1. Objetivos

O foco deste trabalho será centrado na tecnologia JavaFX, tendo como

objetivo apresentar uma visão geral, e demonstrar parte de suas funcionalidades

através de exemplos práticos, abordando seus principais aspectos positivos e

negativos, bem como os conceitos envolvidos. Os detalhamentos da linguagem

JavaFX Script tais como sintaxes, semântica, e nuances da API, serão

demonstrados de maneira superficial.

Page 11: Javafx

13

Embora o nome completo da plataforma JavaFX é JavaFX Rich Client,

sendo composto ainda por vários outros componentes, no contexto do trabalho o

termo será simplificado, sendo referenciado apenas como JavaFX. (WEAVER,

2009).

1.2. Metodologia

Como critério de desenvolvimento foi adotado a utilização do IDE Netbeans,

em função do plugin disponível para o IDE Eclipse ainda não apresentar-se com

nível de maturidade adequado, estando na versão beta no decorrer da

implementação dos exemplos. Outro ponto considerado, é o fato do Netbeans ser o

IDE oficial para o desenvolvimento na plataforma JavaFX, e possuir atualizações

com maior frequência.

Como restrição de plataforma, o ambiente de execução desktop e web foram

delimitados somente ao sistema operacional Windows, em virtude dos demais

sistemas operacionais, o ambiente JavaFX ainda não atingiu o estágio adequado de

maturidade (SUN, 2009a).

Com relação ao conteúdo exposto, serão abordados as revisões

bibliográficas baseados somente até o release JavaFX 1.2, visto que novas versões

ou revisões poderão ser disponibilizadas no decorrer do trabalho, podendo impactar

diretamente no desenvolvimento deste, e possivelmente, inviabilizando o

acompanhamento desta evolução.

1.3. Organização do Trabalho

O texto da monografia foi organizado em 4 capítulos: introdução, revisão

bibliográfica, implementação e conclusões.

No segundo capítulo são abordados a revisão bibliográfica, onde serão

apresentados o introdução sobre RIA, por seguinte, o histórico de evolução da

tecnologia, os principais fundamentos da linguagem JavaFX Script e grande parte de

sua estrutura, bem como, os principais conceitos envolvidos.

Page 12: Javafx

14

O terceiro capítulo trata-se da implementação de exemplos, formalizando o

conteúdo desenvolvido neste trabalho, que serviram de base para a demonstração,

o acompanhamento e o funcionamento, na prática, do desenvolvimento de

pequenos aplicativos utilizando a tecnologia JavaFX.

No último capítulo expõe as conclusões obtidas e as propostas para

trabalhos futuros.

Page 13: Javafx

15

2. Revisão Bibliográfica

As aplicações baseadas no HTML (Hyper Text Markup Language) tornaram-

se populares devido ao baixo custo de desenvolvimento, de arquitetura simples, fácil

manuseio e aprendizado. Entretanto os benefícios foram compensados com uma

perca significativa de algumas funcionalidades de UI (User Interface), devido a

simplicidade na paleta limitada de componentes e em seu modelo de interação

restrita. Tais recursos de interfaces podem ser exigidos por softwares mais

complexos que requerem alta interatividade, não se limitando a atualização de várias

páginas HTML para completar uma transação (O'ROURKE, 2004; SUN, 2007a;

WEAVER, 2009).

Outro ponto negativo do HTML é com relação a codificação, que apesar de

iniciar-se de maneira simples, pode requerer uma grande quantidade de esforço

para efetuar tarefas sem maiores complicações de interface (O'ROURKE, 2004).

2.1. Rich Internet Application - RIA

O termo ”Rich Internet Application” - RIA, foi introduzido pela Macromedia

por Jeremy Allaire em março de 2002, para iniciar a unificação das aplicações do

tradicional desktop e web, no sentido de utilizar as vantagens e superar as

desvantagens de ambas as arquiteturas. As primeiras aplicações RIA originaram-se

em 1995, através dos pequenos programas chamados de Java applets, que podem

ser executados via browser sob a máquina virtual Java (JVM - Java Virtual Machine),

com algumas restrições de segurança (BOZZON, 2006).

O princípio básico é proporcionar um tempo de execução eficiente e de alta

performance para a execução do código, tanto no conteúdo quanto na comunicação.

Inclui a requisição/resposta para a página de renderização do modelo, a

necessidade de gerar dinamicamente um grande conteúdo de texto para a simples

transmissão de dados, o armazenamento de dados no lado do cliente, e a

possibilidade de se invocar a lógica de negócios remotamente (lado do servidor) e a

facilidade de se manipular-los. O RIA fornece poderosos e extensivos modelos de

Page 14: Javafx

16

objetos para interatividade em termos de aplicações e eventos. Esses modelos

baseados em objetos, devem se integrar com a interface do usuário, e a

comunicações e serviços a nível de sistema (ALLAIRE, 2002).

A construção de RIAs com metodologias de engenharia da Web requer

adaptação do fluxo de desenvolvimento de aplicações Web tradicionais, para

considerar a capacidade do novo lado do cliente, a nova característica de

apresentação, bem como os diferentes mecanismos de comunicação entre o

servidor e o cliente. As principais questões correlacionadas com a concepção do RIA

podem ser agrupados em quatro temas conforme a Tabela 1 (LINAJE, 2008):

Tema Descrição

Dados O conteúdo volátil e persistente são armazenados e manipulados

no lado do cliente e do servidor (LINAJE, 2008);

Lógica de

negócio

Em ambos os lados, tanto o cliente quanto o servidor podem

realizar operações complexas (LINAJE, 2008);

Comunicação Permite a comunicação assíncrona, bem como a distribuição de

dados e de funcionalidades entre o cliente e o servidor; ampliam as

características dos eventos produzidos tais como podem se

originar, detectar, notificar, ou ser processado em uma variedade

de maneiras (LINAJE, 2008);

Apresentação Oferece apresentações aprimoradas de interações com o usuário,

permitindo-o operar como aplicações em uma única página

(LINAJE, 2008).

Tabela 1. Temas RIA

O RIA utiliza-se de um motor de renderização relativamente robusto no

modelo client-side, que podem apresentar-se muito densas, responsiva e

graficamente rica em interface ao usuário. Podem ainda oferecer uma ampla

variedade de controles, e geralmente podem permitir a construção de gráficos em

tempo real através de qualquer SVG (Scalable Vector Graphics) ou algum outro tipo

de mecanismo (O'ROURKE, 2004).

Page 15: Javafx

17

Outro benefício do RIA em comparação com o HTML é que os dados podem

ser armazenados em cache no cliente, permitindo uma interface mais ágil com

menos trafego de informações com o servidor. Em muitos casos, o cliente pode

permanecer conectado à fonte de dados, possibilitando que servidor possa atualizar

o cliente em tempo real. Alem disso, tal recurso possibilita o desenvolvimento de

aplicações que podem ser projetadas para trabalhar no modo offline, recurso

necessário para seu funcionamento em dispositivos tais como o PDA (Personal

Digital Assistant), ou pelo menos degradar-se normalmente, mesmo quando a

conexão é perdida. Muitos aplicativos requerem o suporte para conexões

persistentes em dois sentidos, a notificação baseada em comunicações

(O'ROURKE, 2004; ALLAIRE, 2002).

A promessa de clientes ricos inclui a capacidade de separar a lógica de

apresentação limpa e interfaces de usuário a partir da lógica do aplicativo

hospedado na rede, permitindo o uso da Internet e serviços de dados fornecidos

pelos servidores de aplicação. O XML (Extensible Markup Language) é geralmente

utilizado como o formato de transferência de dados e, às vezes, também como

descritor de leiaute de formulário. Clientes ricos devem fornecer um modelo para

facilitar o uso de serviços remotos fornecidos por componentes de back-end, seja

hospedado em um servidor de aplicativos ou acessados como XML Web Service (

ALLAIRE, 2002; O'ROURKE, 2004)

A seguir é apresentada na Tabela 2 que faz uma comparação dentre as

características das plataformas desktop, web e RIA.

Page 16: Javafx

18

Característica Desktop Web RIA

Cliente universal (Navegador)

Não Sim Sim

Instalação no Cliente Complexo Simples Simples

Capacidade de interação

Rico Limitado Rico

Lógica de negócio no lado do Servidor

Sim Sim Sim

Lógica de negócio no lado do Cliente

Sim Limitado Sim

Total atualização de página requerida

Não Sim Não

Comunicação Servidor-Cliente

Sim Não Sim

Funcionamento Offline

Sim Não Sim

Tabela 2. Comparação dentre desktop, web e RIA

Dentre as mais conhecidas tecnologias para o desenvolvimento de

aplicações ricas para Internet se destacam: AJAX, Flash, FLEX, OpenLaszlo,

Silverlight, entre outras novas, como o próprio JavaFX que ainda estão emergindo

no mercado (LINAJE, 2008).

As aplicações ricas, no contexto geral, podem ser classificadas da conforme

a Tabela 3 :

Page 17: Javafx

19

Classificação Definição

Baseado em script A lógica no lado do cliente é implementada via

linguagem de scripts, tal como o JavaScript, cujo as

interfaces são baseadas na combinação dentre HTML e

CSS (Cascading Style Sheets) (BOZZON, 2006);

Baseado em plugin A renderização avançada e o processamento de eventos

são concedidos através de plugins do navegador, por

meio de interpretação de dados no formato XML.

Também podem ser disponibilizados via programas de

uso geral ou arquivos de multimídia, como o Flash, Flex,

Laszlo, entre outros (BOZZON, 2006);

Baseado no navegador

(browser)

A rica interação é nativamente suportado por alguns

navegadores que podem interpretar linguagens de

definição de interface declarativa, tais como o XUL - XML

User Interface Language (BOZZON, 2006);

Tecnologias desktop

baseado em web

Pode ser definido como as aplicações que podem ser

baixadas e executadas diretamente pela web, isto é, a

execução de programas de Internet no qual são

transferidos para área de trabalho (local), porém é

executado fora do browser, como por exemplo o Java

Web Start e o Window Smart Client (BOZZON, 2006).

Tabela 3. Classificação dos tipos de RIA

2.2. Tecnologias Similares

Como principais concorrentes diretos do JavaFX foram selecionados as

seguintes tecnologias já consolidadas no mercado: AJAX (Asynchronous Javascript

and XML), FLEX e o Silverlight.

Baseado na linguagem Javascript, o AJAX, atua no lado cliente, sendo

desenvolvido para a criação de aplicações Web com maior interatividade, com o

Page 18: Javafx

20

propósito de se evitar a atualização de páginas HTML. Os dados podem ser

recuperados de forma assíncrona utilizando-se do objeto XMLHttpRequest sem a

necessidade de se recarregar a interface inteira. Muitos frameworks estão

disponíveis para o desenvolvimento com o AJAX, pelo o qual tentam contornar o

problema das diferenças dentre os navegadores (LINAJE, 2008);

O FLEX, é um produto open source com maturidade comercial para o

desenvolvimento de interfaces ricas, fornecido pelo Adobe System, pelo qual se

utiliza de duas linguagens: o MXML, com sintaxe declarativa baseado em XML; e o

ActionScript, definida como uma linguagem de programação avançada. Com o

MXML é possível descrever os comportamentos e leiaute de interface de usuário, e

o ActionScript para implementação da lógica no lado do cliente. As principais

desvantagens de ambos em Flash e Flex é o suporte limitado para XML e padrões

de Web Services e a relativa imaturidade do ambiente como uma ferramenta de

desenvolvimento de aplicações. Por outro lado, as principais vantagens é a

facilidade com a qual é possível criar-se animações complexas e a disponibilidade

de complementos de terceiros. O Flex inclui uma biblioteca de componentes

compostos por 100 itens para a construção de interfaces, além de um depurador

interativo de aplicativos Flex (ADOBE, 2009; LINAJE, 2008; O'ROURKE, 2004);

Por fim, o SilverLight trata-se de uma tecnologia baseado no WPF (Windows

Presentation Foundation), sendo uma plataforma da Microsoft para o

desenvolvimento RIA. Seguindo o mesmo caminho dos demais concorrentes, o

Silverlight possui também uma linguagem declarativa baseada em XML, o XAML

(Extensible Application Markup Language), tendo como base do recurso de

apresentação do Microsoft .NET Framework 3.0 (infra-estrutura de programação

Windows) (LINAJE, 2008; MORONEY, 2007).

2.3. Breve Histórico da Evolução do JavaFX

O projeto iniciou-se em setembro de 2005 com a aquisição da empresa

SeeBeyond Technology Corporation. A obtenção trouxe para a Sun Microsystems o

engenheiro sênior, Christopher Oliver, desenvolvedor do projeto chamado F3 (forms

Page 19: Javafx

21

folows function), também conhecido como JFX, no qual mais tarde foi rebatizado

como JavaFX Script (OLIVER, 2006, 2007).

O JavaFX foi anunciado pela primeira vez em maio de 2007 na conferência

JavaOne WorldWide Java Developer. No mesmo período, também foi divulgado a

aquisição completa das propriedades intelectuais da empresa Savaje Technologies,

que teve como um de seus objetivos, expandirem o mercado de dispositivos móveis

integrados com a tecnologia Java como client-side. (SUN, 2007b)

A primeira versão do JavaFX, considerada um protótipo, foi disponibilizada

ao público como uma linguagem interpretada, permitindo que desenvolvedores, após

sua “degustação”, contribuir com feedbacks para a evolução do produto. Dois livros

foram publicados no período de 2007, baseados nesta versão (WEAVER, 2009).

Em abril de 2008 com o lançamento do JRE 6 Update 10 (6u10), também

publicado no artigo por Ethan Nicholas, incluiu componentes e recursos adicionais

para o suporte ao runtime do JavaFX, desenvolvido inicialmente voltado para a

plataforma Windows 32-bit, sendo considerado um marco para a nova tecnologia,

dentre outras inovações. O release trouxe soluções para o JRE no problema de

implantação de aplicações desenvolvidas sob o JavaFX, que exigia o runtime

específico para sua execução (KRILL, 2008; NICHOLAS, 2008; SUN, 2008b).

Por seguinte, em maio de 2008 a Sun Microsystems anunciou o plano de

entrega do JavaFX para as plataformas browser e desktop para o terceiro trimestre

do mesmo ano, e em sequência para dispositivos móveis no segundo trimestre de

2009. Uma prévia do JavaFX foi liberado em julho de 2008 (SUN, 2009a).

2.4. JavaFX 1.0

Oficialmente o JavaFX foi lançado em 4 de dezembro de 2008, com a

liberação da primeira versão, o release 1.0, composto por três componentes chaves:

o SDK, a ferramenta JavaFX Production Suite, e o JavaFX Desktop. Inicialmente foi

disponibilizado para os sistemas operacionais Windows e MacOSX, compondo uma

nova família de produtos baseados na tecnologia Java. (SUN, 2008a, 2009a)

O JavaFX 1.0 incluiu no pacote um completo conjunto de efeitos gráficos,

aliado ao sofisticado framework de aceleração gráfica via hardware (GPU – Graphic

Page 20: Javafx

22

Processor Unit), quando disponível no dispositivo ou na plataforma. Também foi

adicionado o suporte para exibição de vídeos através do uso de decodificadores

nativos para cada plataforma, o VP6, fornecido pela empresa On2 Technologies,

Inc., parceiro da Sun, líder em soluções de compreensão de vídeos (OLIVER, 2009;

SUN, 2008a, 2008j).

2.5. JavaFX 1.1

Na sequência, em 12 de fevereiro de 2009, foi oficializado o release do

JavaFX 1.1 que anunciou o esperado JavaFX Mobile, pelo o qual forneceu um

completo sistema de software para dispositivos móveis via licença OEM (Original

Equipment Manufacturer) para fabricantes e outras companhias que desejem aderir

a nova plataforma. Incluiu no pacote algumas vantagens, dentre que se destacam, o

aumento de performance, a implementação dos tipos numéricos da linguagem Java

(float, double, long, int, short, e byte) no JavaFX Script e a compatibilidade binária

com o release anterior, o JavaFX 1.0 (O'NEILL, 2007; SUN, 2009a, 2009f).

O lançamento contou ainda com adesão de novos parceiros para a nova

tecnologia JavaFX, composto por conhecidos fabricantes e prestadores de serviços,

como: Sony Ericsson, LG Electronics, Orange, Sprint, Cynergy e MobiTV (SUN,

2009f).

2.6. JavaFX 1.2

No último update, o JavaFX 1.2, lançado em 2 de junho de 2009, entregou

significantes atualizações, tais como o suporte como early acess aos sistemas

operacionais Linux e OpenSolaris, a adição de novas bibliotecas de interfaces (GUI),

o aprimoramento considerável de performance através do runtime Java SE 6 Update

14, dentre outras mudanças que visando maiores melhorias, ocasionaram

incompatibilidades de API (Application Programming Interface) com as versões

anteriores. Tais alterações de maiores impactos incluíram a remoção/ renomeação

de classes e variáveis, antes presentes no SDK 1.1, e a introdução de outras novas

na versão corrente, que resultou em binários inconciliáveis dentre o JavaFX 1.1 e

Page 21: Javafx

23

1.2. Sendo assim, todas as bibliotecas codificadas nos releases anteriores, bem

como suas dependências, precisam ser recompiladas para migrarem para a versão

mais atual (CHO, 2009; SUN, 2009a, 2009b, 2009e)

O SDK 1.2 ainda foi complementado com o preview do JavaFX TV, exposto

pela primeira vez ao público no evento Java One Conference de 2009, completando

a visão de aplicações JavaFX funcionando em navegadores, desktops, dispositivos

móveis e televisores. Também anunciado na conferência, destacou-se a

demonstração prévia da ferramenta JavaFX Authoring Tool, pelo o qual permite que

designers e desenvolvedores construam suas aplicações de forma visual (SUN,

2009b).

A Sun Microsystems demonstrando seu com o comprometimento para o

código livre, como parte do modelo de negócio, forneceu o compilador do JavaFX,

incluindo parte das bibliotecas de gráficos e ferramentas para o projeto OpenJFX,

sob a licença GPL (General Public License) 2.0. O projeto do compilador OpenJFX

possui como foco a tradução de scripts JavaFX em arquivos de classes JVM,

compilados como bytecodes (OpenFX, 2009a; SUN, 2009j).

2.7. JavaFX TV

Com relação ao runtime do JavaFX TV, a Sun Microsystems alega estar

trabalhando com fabricantes de dispositivos, tendo a previsão inicial de disponibilizar

o JavaFX SDK aos desenvolvedores ao final de 2009. Na conferência JavaOne, em

junho de 2009, a Sun demonstrou uma prova de conceito do JavaFX rodando em

uma TV de próxima geração da LG Electronics TV. (SUN, 2009b, 2009j).

2.8. JavaFX Mobile

Atualmente foi disponibilizado um runtime para o sistema operacional

Windows Mobile, fornecido somente para fins de desenvolvimento. Os testes de

ambiente realizados pela Sun, utilizaram o JavaFX SDK 1.2 nos dispositivos HTC

Diamond e LG Incite touch (SUN, 2009l).

Page 22: Javafx

24

Na versão corrente ainda possui vários limitadores, tais como a execução de

somente uma aplicação JavaFX por vez, comportamentos dos controles de UI e

gráficos não confiáveis, dentre outros.

2.9. JavaFX Script

O JavaFX Script é uma linguagem de script baseado nas linguagens

Javascript, Miranda, SQL e Lisp. Derivou-se do projeto F3, que inicialmente não era

uma linguagem de programação, conceitualmente apresentava-se como um tipo de

linguagem de modelagem com notações de objetos UML (Unified Modeling

Language), consistindo apenas em declarações de classes e valores de constantes.

A plataforma JavaFX foi arquitetada para suportar múltiplas linguagens de script, tal

como as linguagens baseadas de marcação visual, como o XML. (OLIVER, 2006,

2007, 2009; O'NEILL, 2007; SUN, 2009j).

Nos conceitos técnicos, o JavaFX Script é uma linguagem procedural,

orientado a objetos, desenvolvida para a especificação de componentes de GUI,

composto por sintaxes e expressões declarativas (relações entre os componentes

gráficos interativos), inferência de tipos (baseado no contexto da variável o tipo de

dado é auto-interpretado pelo compilador), data-binding (sincronização automática

entre os dados da aplicação e os componentes de interfaces exibidos ao usuário)

com suporte a gráficos em duas dimensões e a padrões da API de componentes do

Swing. Diferentemente dos seus concorrentes do mercado, a linguagem JavaFX

Script é statically typed (estaticamente “tipado”), ou seja, o tipo do objeto é

conhecido pelo compilador baseado em sua declaração em tempo de compilação

(OLIVER, 2006, 2009; O'NEILL, 2007; SUN, 2009d).

Obtém as vantagens do modelo de programação Java, sendo inclusive

dependente de compilação, no qual seu código fonte necessita ser previamente

convertido para Java bytecode antes de estar disponível para a execução no

sistema. Alem disso, proporciona uma série de recursos derivados do Java tais

como a estruturação do código, encapsulamento, integração direta com o mesmo

(importação de classes, criação de objetos, chamada de métodos, implementação

de interfaces, entre outros), o reuso, o suporte nativo ao padrão de projeto com o

Page 23: Javafx

25

modelo MVC (Model View Control), dentre outras características que provêm a

possibilidade de fácil entendimento e manutenibilidade em grandes programas,

sendo capaz de suportar interfaces de qualquer tamanho de complexidade

(HOMMEL, 2009; OLIVER, 2006, 2009; O'NEILL, 2007; SUN, 2009a, 2009c, 2009d).

O conceito central da linguagem JavaFX, relacionado a UI, é baseado no

scene graph (grafo de cena). O scene graph trata-se de uma estrutura de dados,

semelhante a uma arvore, que define a hierarquia de gráficos em uma cena, onde

um único elemento é denominado como nó. Cada nó pode manipular diferentes tipos

de objetos (conteúdos), tais como componentes UI, textos, imagens e mídias.

Expressa um modelo de interface de fácil manipulação para anexar

comportamentos, tais como a animação e efeitos de transição, ou para vincular a

modelos de dados subjacente (SUN, 2009a; WEAVER, 2009).

2.10. Divisão por Perfis

No contexto geral, a plataforma pode ser dividida em três perfis, o comum

(common profile), desktop (desktop profile) e dispositivo móvel (mobile profile). No

entanto na atual versão, o JavaFX 1.2, estão disponíveis apenas o perfil comum e

desktop (SUN, 2009a; WEAVER, 2009).

O common profile, é o perfil comum da API no qual incluem classes

compartilhadas em ambas as plataformas, PC (incluindo o ambiente web) e

dispositivos móveis. Contém o núcleo de funcionalidades necessários para os

recursos de imagens, vídeos, textos, animações e chamada de serviços. É

suportado por todos os dispositivos que executam o JavaFX, tais como, PC,

telefones celulares e dentre outros (MALENKOV, 2009; SUN, 2009a; WEAVER,

2009).

No perfil desktop, baseado no Java SE (Java 2 Standard Edition), foram

adicionados funcionalidades e vantagens exclusivas da plataforma desktop, que

incluem componentes baseados no Swing, efeitos gráficos, dentre muitas outras

características não suportadas em dispositivos embarcados, tais como efeitos

visuais presentes no pacote javafx.scene.effect. O modelo é também suportado na

execução no browser (MALENKOV, 2009; SUN, 2009a; WEAVER, 2009).

Page 24: Javafx

26

No futuro será criado o mobile profile que poderá ser designado

especificamente para dispositivos móveis, baseado na implementação estendida do

JavaME (Java Micro Edition), que incluem recursos tais como o bluetooth, GPS

(Global Positioning System), detectores de movimento, e entre outros itens

relacionados aos aparelhos portáveis. Contudo, até essas características serem

efetivamente disponibilizadas, no momento, as referências ao perfil mobile é

equivalente ao common profile (SUN, 2009a; WEAVER, 2009).

Dentre outras características técnicas de destaque presentes na versão

atual (SDK 1.2), é exposto na Tabela 4 :

Recurso Descrição

Gerenciamento do

JavaFX I/O (In/Out)

Mascaram as diferenças entre o desktop e dispositivos móveis

(SUN, 2009a, 2009c);

Skinnable CSS

(Cascading Style

Sheets)

O Skin recurso responsável por toda aparência visual e,

ultimamente também pela interação visual com o controle, no

ambiente JavaFX, os atributos CSS podem ser especificados,

ou diretamente aplicados nos nós da cena do grafo, tal como

no HTML (BAIR, 2009);

Triggers (gatilhos) Conceitualmente pode ser definido como uma funcionalidade,

ou um trecho de código, que é invocado e executado

automaticamente em determinadas condições, tal como o

valor de um atributo é alterado. Métodos assessores (getters

e setters) podem ser substituídos através deste recurso,

simplificando a tarefa de desenvolvimento, bem como

evidenciando as vantagens da sintaxe declarativa e o uso do

encapsulamento (SUN, 2009a; WEAVER, 2009);

Gráficos Disponível no pacote javafx.scene.chart no perfil comum a

todas as plataformas, que contém os seguintes tipos de

gráficos: barras, área, bolha, linha e dispersão (SUN, 2009a;

WEAVER, 2009).

Tabela 4. Recursos de destaque do JavaFX

Page 25: Javafx

27

2.11. Colaboração entre Designers e Desenvolvedores

A interação entre os designers, responsáveis pela beleza da interface e a

efetividade da experiência do usuário, e os desenvolvedores que são focados pela

funcionalidade da aplicação, foi considerado um ponto fundamental. A articulação de

uma aplicação RIA de sucesso, alem de suas habilidades funcionais, é o seu apelo

estético, que evidencia a necessidade de uma intensa colaboração entre ambas as

partes (SUN, 2009h).

O JavaFX Production Suite é um produto separado, disponível para

download, como parte da plataforma JavaFX, pelo o qual foi designado e projetado

desde o início para suportar o fluxo de trabalho interativo, dentre desenvolvedores e

artistas, permitindo a substituição de novas versões dos elementos visuais sem

nenhuma alteração do código, simplificando o processo de importação de objetos

gráficos (SUN, 2009h).

O ambiente JavaFX cria uma separação entre recursos gráficos e de lógica

de negócios. Deste modo permite os designers modificarem seus projetos

frequentemente, enquanto manterem os nomes dos objetos gráficos intactos

(identificadores), os elementos de interface podem ser modificados sem qualquer

alteração na lógica de negócio. Devido a esta característica, possibilita que os

objetos gráficos possam ser transferidos para uma nova posição em tela sem causar

impactos ao modelo de negócio (SUN, 2009h).

Os gráficos exportados a partir da ferramenta JavaFX Production Suite

podem ser manipulados como objetos individuais (grupos, camadas, e alguns

efeitos) dentro do ambiente de desenvolvimento das aplicações JavaFX (SUN,

2009h).

Provê a facilidade aos desenvolvedores/designers para manipular objetos

gráficos individuais dentro de um recurso visual, bem como a opção de escolha das

ferramentas gráficas de sua preferência. Possui plugins para conversão de gráficos

originados do Adobe Illustrator ou Photoshop, para os formatos próprios do JavaFX,

cuja as extensões: FXZ e FXD (JavaFX Data Files) (SUN, 2009h).

Após realizar o processo de conversão a partir das ferramentas gráficas

gerando para o formato reconhecido pelo JavaFX, um novo arquivo é criado com a

Page 26: Javafx

28

extensão FXZ. O recipiente FXZ é um arquivo compactado utilizando-se da

compressão do tipo ZIP, logo seu conteúdo pode ser visualizado por qualquer

utilitário ZIP, ou por um editor de texto, caso descompactado manualmente; também

pode ser aberto pelo IDE Netbeans. Em seu conteúdo existe pelo menos um arquivo

FXD, pelo o qual é a descrição textual do gráfico, e em adição, pode incorporar

outros recursos gráficos, tais como arquivos de imagens ou fontes TrueType (SUN,

2009i).

A criação do novo formato FXD, que constitui de um mapeamento descritivo,

um-para-um, para os grafos de cena do JavaFX API, foi motivado devido as

dificuldades de representação dos elementos e das características presentes em

nos formatos, JavaFX Script e SVG, que deveriam ser compatíveis. Os objetos

gráficos podem preservar seus itens originais como camadas e atributos após serem

convertidos pelas ferramentas recomendadas (SUN, 2009h, 2009i).

2.12. Implantação

No ambiente de desenvolvimento estão disponíveis quatro formas distintas

para a implantação do software, conforme é exibido na Tabela 5 :

Plataforma Descrição

Execução Padrão (Standard)

Consiste em uma aplicação stand-alone destinado ao perfil

desktop, que pode ser inicializado por uma linha de comando,

por exemplo: javafx -jar <nome-do-aplicativo.jar> (CASTILLO,

2009);

Execução Web Start

Também como stand-alone, porém sua execução é feita através

da tecnologia Java Web Start, pelo o qual possibilita que

programas Java possam iniciar diretamente pelo browser,

executando fora do escopo do navegador (CASTILLO, 2009);

Execução no Browser

Baseado na execução em applet onde o software é embutido

dentro de uma página HTML para ser visualizado pelo browser

(CASTILLO, 2009; CHOUDHARY, 2009);

Page 27: Javafx

29

Execução no Mobile Emulator

(emulador da plataforma

mobile)

Executa o aplicativo como MIDlet, sob o JavaFX Mobile

Emulator, ferramenta que simula dispositivo no ambiente móvel.

A opção do simulador, no momento, está disponível apenas o

sistema operacional Windows (CASTILLO, 2009).

Tabela 5. Formas de implantação

A partir da plataforma Java 2 (desde da versão 1.4) com o surgimento do

Java Web Start – e da subjacente JNLP (Java Network Launch Protocol), tornaram-

se uma parte padrão que vieram para solucionar os problemas da arquitetura de

segurança, e as diferenças dentre os navegadores no contexto de client-side,

(ZUKOWSKI, 2002). O Acesso às extensões JNLP em applets, tem sido escrito para

aplicações Java Web Start, como a ligação para o Java 3D API OpenGL, e em

especial, para o grafo de cena para o runtime do JavaFX (SUN, 2007d).

Como ênfase no modo de instalação pela Internet, foi destacada as formas

de implantação por meio de applet e Java Web Start, ambos que se utilizam do

protocolo JNLP (SUN, 2009a; WEAVER, 2009).

A implantação via “drag and drog” foi disponibilizado após o release Java 6

Update 10, possibilitando a instalação de programas applet JavaFX através do

recurso de se arrastar a aplicação, com o mouse, para fora da janela do navegador,

mantendo a tecla ALT pressionada. O funcionamento do aplicativo, após sua

instalação, ocorre mesmo quando o browser estiver fechado (KOSTOVAROV, 2009;

WEAVER, 2009).

Uma aplicação Java Web Start pode ser implantada através de um

navegador apenas em sua primeira execução. Após a aplicação Java Web Start ser

baixada e depois do usuário aceitar o certificado de segurança, ele funciona quase

como um programa stand-alone. Tais aplicações também podem ser lançadas

através do menu Iniciar do SO Windows ou por meio de atalhos criados durante o

processo de instalação (KOSTOVAROV, 2009).

Page 28: Javafx

30

2.13. Java Sandbox

No contexto geral, a implantação via Internet, utilizando-se dos mecanismos

de applet ou Java Web Start, em termos de segurança, possuem diferenças

mínimas entre ambos, principalmente na forma como podem ser instalados no lado

cliente (KOSTOVAROV, 2009).

Um dos conceitos fundamentais de segurança no Java é a Sandbox Java,

no qual o JavaFX se beneficia, sendo esta uma das vantagens de segurança

oriundos do Java. O modelo de segurança sandbox é uma parte intrínseca da

arquitetura Java, fazendo parte como um elemento do Java Runtime Environment e

da API (KOSTOVAROV, 2009).

O modelo de segurança Java é focado em proteger os usuários de

programas hostis que podem ser baixados a partir de fontes não confiáveis na rede.

Para atingir esta meta, o runtime fornece uma proteção como uma “caixa de areia",

tal como sua tradução literal, sob os programas Java de procedências duvidosas

que são executados no ambiente (KOSTOVAROV, 2009).

Para os aplicativos implantados pela web, no caso via applets ou Java Web

Start, a JVM proíbe muitas atividades consideradas de risco a segurança do

sistema. Outros novos limites foram incluídos a partir do release Java 6 Update 10

(KOSTOVAROV, 2009).

A estrutura de segurança do sandbox tem como objetivo simplificar o

acesso a programas não assinados. Assim, o sistema de segurança não restringe

completamente os aplicativos não confiáveis, que podem partir de quaisquer fontes.

O sandbox apenas bloqueia a execução dos códigos considerados maliciosos,

oriundos de software não assinado, evitando possíveis danos que poderiam ser

causados. Por outro lado, caso o programa que tenta efetuar atividades

consideradas nocivas seja devidamente certificado, ou seja, assinado, o usuário

pode explicitamente permitir o acesso deste, através dos avisos de segurança

emitidos pelo runtime (KOSTOVAROV, 2009).

A assinatura é o meio legal para assegurar a execução do aplicativo no caso

do mesmo possuir rotinas não permitidas, assim, assinando-o digitalmente, são

concedidos os privilégios de segurança para exercer funcionalidades antes

Page 29: Javafx

31

indisponíveis. O processo, resumidamente, necessita do uso chaves públicas e

privadas para verificação da autenticidade do certificado de validade (SUN, 2009o).

Um arquivo de política pode ser definido para exigir uma assinatura em todos os

applets ou aplicações que tentam executar o arquivo de política. A assinatura é uma

maneira de verificar se o programa possui origens de uma fonte reconhecida, e pode

ser confiável para execução com as permissões concedidas no arquivo de diretiva

(AUSTIN, 1999).

Para a plataforma móvel, uma versão futura do JavaFX Mobile deverá apoiar

a política de segurança em camadas, em cima do Java ME (MSA - Mobile Service

Architecture) no modelo de segurança (KOSTOVAROV, 2009).

Page 30: Javafx

32

3. DESENVOLVIMENTO JAVAFX

Com o intuito de explorar o desenvolvimento de aplicativos sob a plataforma

JavaFX, no presente trabalho, são apresentados análises no desenvolvimento na

prática, através da implementação de simples exemplos.

Os tópicos abordados limitam-se aos controles comuns destinados a

construção de interfaces comerciais, tais como rótulos, campos de textos, botões e

dentre outros componentes atualmente disponíveis. Embora a parte estética da GUI,

recursos como efeitos, animações, transformações de objetos, dentre outros - sejam

importantes características do RIA, tais propriedades foram omitidas para garantir a

execução dos exemplos nos ambientes propostos.

Buscando o teste de execução nas plataformas propostas, desktop, móvel e

web, não foram utilizadas nenhuma das bibliotecas de terceiros atualmente

disponíveis nas implementações. Tal fato é justificado devido a possibilidade de tais

frameworks possuírem como dependência, recursos não suportados no JavaFX

Mobile.

Os programas foram implantados e testados nos ambientes: desktop, web,

mobile (simulador). Na prática foram submetidos aos dispositivos HTC modelos

P4351 e Diamond, portando o sistema operacional Windows Mobile, ambos com

poder de hardware acima dos requisitos mínimos necessários (SUN, 2009l).

Em virtude de erros ocorridos nos testes feitos nos aparelhos HTC, tal como

travamento do runtime do JavaFX, foi necessário incluir um controle para deixar de

realizar algumas funcionalidades quando o ambiente de execução for o móvel. O

Quadro 1 demonstra o comparador introduzido nos projetos para contornar o

escopo de código JavaFX Script, que causaram bugs em tempo de execução:

... if ("{__PROFILE__}" != "mobile"){ ...código não suportado atualmente no JavaFX Mobile… } ...

Quadro 1. Controle contra travamentos.

Page 31: Javafx

33

3.1. Primeiro Projeto

Como primeiro exemplo, o “Alô Mundo!”, o objetivo inicial foi a simplicidade

do código, sendo desenvolvido sob o perfil comum do JavaFX, afim de permitir sua

execução nos ambientes desktop, web ou dispositivos móveis.

A aplicação consiste em uma janela, contendo somente dois componentes:

um rótulo e um botão, ambos com alinhamento centralizado tendo como referência a

largura da tela, demonstrando uma das técnicas de leiaute aliado ao recuso de bind.

No evento do clique do botão é exibida uma caixa de dialogo com mensagem “Alô

Mundo!”, concatenado com o extenso da data atual. Neste exemplo é ilustrado uma

prévia do forte relacionamento com a linguagem Java, através da utilização do

objeto Java, representado pela a classe java.util.Date instanciada dentro do código

JavaFX Script, conforme é apresentado no Quadro 2 . O código completo pode ser

visto no (APÊNDICE A).

… importação de bibliotecas omitidas Stage { title: "Primeiro Projeto" var cena: Scene = Scene { fill: Color.AQUAMARINE width: 250 height: 250 var vbox: VBox content: [ vbox = VBox { spacing: 20 nodeHPos: HPos.CENTER layoutX: bind (cena.width - vbox.layoutBounds.width) /2 content: [Text { font: Font.font("Arial", FontWeight.BOLD, 20) content: "JavaFX" } Button { text: "Botão" action: function () { if ("{__PROFILE__}" != "mobile"){ var dataAtual = new Date(); Alert.inform("Informação", "Alô Mundo! {dataAtual}"); } } } ] } ] }

Page 32: Javafx

34

scene : cena }

Quadro 2. Código fonte do Primeiro Projeto

Neste exemplo não foi utilizado o recurso de formatação de data, tal como a

utilização da máscara “DD/MM/YYYY” (dia, mês e ano), visando à portabilidade

entre as plataformas. No ambiente mobile a formatação não é suportada.

Na Figura 1 é apresentada o conteúdo em tela executado na plataforma

desktop. O mesmo resultado é obtido quando submetido como applet, porém

incorporado ao navegador.

Figura 1. Primeiro Projeto

Na plataforma móvel, executado no simulador, tal como pode ser observado

na Figura 1 , um defeito relacionado a acentuação foi identificado. No rótulo “botão”,

o caractere “ã” não foi reconhecido. O mesmo problema foi observado no artigo de

Osvaldo Pinali DOEDERLEIN, que demonstrava a execução de sua aplicação em

plataformas distintas (DOEDERLEIN, 2009b).

Page 33: Javafx

35

Ainda sobre o erro de caracteres acentuados, felizmente, o exemplo ao ser

implantado e testado em um dispositivo real, o problema não ocorreu. O fato sugeriu

indícios de tratar-se de apenas um possível bug isolado relacionado ao simulador. O

resultado deste teste pode ser visto na Figura 2 :

Figura 2. Primeiro Projeto sob os dispositivos HTC

3.2. Projeto Calculadora

Neste exemplo foi elaborado um projeto de uma calculadora simplificada que

contém somente os operadores básicos aritméticos, ou seja, apenas possui as

operações de soma, subtração, multiplicação e divisão.

O escopo do programa é composto por um campo de texto para exibição

dos números digitados, bem como apresentação os resultados obtidos após o

cálculo; por seguinte, foi incluído um teclado numérico com seus respectivos

operadores, composto por um conjunto de botões da palheta de componentes do

perfil comum.

A interface foi desenvolvida sob o padrão de projeto MVC com o propósito

inicial de demonstrar a interação entre desenvolvedores e artistas gráficos,

utilizando-se do software Corel Draw para exportação da interface no formato SVG.

O resultado foi negativo devido a geração inadequada dos identificadores de objetos

agrupados, após a importação e conversão para o formato FXZ com o aplicativo

Page 34: Javafx

36

“SVG to JavaFX Graphics Converter”. Assim, devido à falta de conhecimento nas

ferramentas gráficas indicadas, como o Adobe Illustrator ou Photoshop, não foi

possível seguir adiante.

Avaliando o código fonte analisando-se o desempenho, foram identificados

certos abusos com relação a instanciação de muitos objetos com finalidade de

tratamento dos eventos de teclado. Porém visualmente, não causaram problemas

de performance no programa, mesmo nos dispositivos móveis.

A interface do programa pode ser vista na Figura 3 que demonstra a

execução nos dispositivos HTC.

Figura 3. Projeto Calculadora nos dispositivos HTC

3.2.1. Integração com Java

Visando a integração direta com o Java, os principais métodos foram

separados em um outro projeto e implementados em uma classe Java, nomeada

como “Calculadora” (APÊNDICE B). A classe, representando o modelo de negócio,

implementou a lógica dos operadores. Também neste projeto Java foi incluído um

tipo enumerado chamado de “Operação”, possuindo os tipos “SOMA”,

“SUBTRACAO”, “MULTIPLICACAO” e “DIVISAO”, para relacionar os operadores

nas comparações.

Page 35: Javafx

37

No Quadro 3 é exibida a classe Java “Calculadora” pelo o qual implementa

os métodos aritméticos:

package calculadora; public class Calculadora { public Double soma(Double x, Double y) { return x + y; } public Double subtrai(Double x, Double y) { return x - y; } public Double multiplica(Double x, Double y) { return x * y; } public Double divide(Double x, Double y) { return x / y; } }

Quadro 3. Classe Java Calculadora

Como complemento, a classe “InterfacePadraoView” implementa a interface

padrão do aplicativo, ilustrando a utilização de parte dos gerenciadores de leiaute

atualmente disponíveis, o Vbox, Hbox e Tile para alinhamento e posicionamento dos

botões na forma de um teclado numérico, tal como pode ser observado no Quadro

4.

.. def numerosDe1a9 = ["7", "8", "9", "4", "5", "6", "1", "2", "3"]; ... HBox { content: [ VBox { content: [ Tile { columns: 3 rows: 3 tileHeight: tamanhoBotao tileWidth: tamanhoBotao vgap: 1 hgap: 1 content: [ for (numero in numerosDe1a9) { Button { text: numero id: "id{numero}" onMouseClicked: controller.onMouseClickedBotaoNumerico onKeyPressed: controller.onKeyPressedCalculadora; } } ] } ...

Quadro 4. Trecho de código da classe InterfacePadr aoView

Page 36: Javafx

38

Com relação ao uso de objetos Java no contexto da linguagem JavaFX, na

classe “Controller” (APÊNDICE C) foram adicionados referências para exemplificar

este recurso. A propriedade privada “calculadora”, equivalente ao conceito de

atributo na linguagem Java, demonstra a utilização da instância da classe Java

“Calculadora”. Enquanto a função pública “calcula()” exibe o relacionamento dentre

objetos Java e JavaFX, bem como, a manipulação dos tipos enumerados dentro do

código, conforme pode ser observado no trecho de código do Quadro 5 .

... var calculadora: Calculadora; ... public function calcula(): Double { return if (operador == Operacao.SOMA) { calculadora.soma(op1, op2); } else if (operador == Operacao.SUBTRACAO) { calculadora.subtrai(op1, op2); } else if (operador == Operacao.MULTIPLICACAO) { calculadora.multiplica(op1, op2); } else if (operador == Operacao.DIVISAO) { calculadora.divide(op1, op2); } else { 0 } } ...

Quadro 5. Trecho de código da classe Controller

Outro ponto de destaque é a possibilidade do uso da API de Collections do

Java, tal como a interface Map e o HashMap, sendo inclusive disponível dentro do

ambiente mobile.

O resultado em tela obtida no ambiente desktop é apresentado na Figura 4 :

Page 37: Javafx

39

Figura 4. Calculadora

3.3. Projeto Agenda

O projeto foi baseado no aplicativo MVC demonstrado no artigo por Osvaldo

Pinali DOEDERLEIN, que apresentou uma implementação de um CRUD (Create,

read, update and delete), como um cadastro de produtos, contendo os recursos de

persistência de dados e a exibição dos resultados na forma de gráficos

(DOEDERLEIN, 2009b).

Contudo, no exemplo codificado neste trabalho, o conteúdo da aplicação é

de uma agenda, consistindo em um simples cadastro de contatos, com seus

respectivos nome e telefone. Neste, foram incluídos todos os itens ilustrados por

DOEDERLEIN, com exceção do gráfico de barras, e a introdução de outros novos

recursos, como a integração com servidor remoto e o uso de internacionalização

(DOEDERLEIN, 2009b).

Em resumo, o software proposto é composto por dois módulos, formando

uma arquitetura cliente-servidor. O cliente foi desenvolvido na plataforma JavaFX,

enquanto o servidor com a linguagem Java.

No ambiente mobile, nos dispositivos reais, a interface obtida é apresentada

na Figura 5 :

Page 38: Javafx

40

Figura 5. Projeto Agenda sob os dispositivos HTC

Infelizmente em razões de restrições de segurança derivados do sandbox,

devido ao uso de código considerado não confiável com a classe

javafx.io.http.HttpRequest, o projeto deste exemplo não pode ser executado no

ambiente web, tanto como applet ou webstart. O aplicativo somente poderia possuir

os devidos privilégios de execução a menos que fosse assinado digitalmente.

3.3.1. Lado servidor

O servidor trata-se de uma aplicação web que tem como objetivo produzir

um conteúdo no formato XML, simulando um serviço RESTFUL. Neste contexto, o

serviço remoto é invocado na inicialização do programa somente quando a lista de

contatos estiver vazia, gerando um conjunto de quatro registros fixos com números

de DDD e telefones aleatórios. O resultado é apresentado no Quadro 6 :

<?xml version="1.0" encoding="UTF-8"?> <contatos> <contato id="1261416750441" nome="Márcio" ddd="87" telefone="99065210"/> <contato id="1261416750456" nome="Contato 1" ddd="31" telefone="99045847"/> <contato id="1261416750490" nome="Contato 2" ddd="97" telefone="99088568"/> <contato id="1261416750500" nome="Contato 3" ddd="35" telefone="99058658"/> </contatos>

Quadro 6. Conteúdo XML retornado pelo servidor

Page 39: Javafx

41

3.3.2. Lado cliente

A interface do cliente é basicamente composta pela interação de duas telas,

uma para listagem dos contatos já cadastrados, e outra para manutenção e

inserção de novos registros. Na primeira tela, além de um componente de listagem,

contém no rodapé com três outros botões: incluir, alterar e excluir. No formulário de

edição (manutenção) possuem os campos de nome, DDD e telefone, seguido no

canto inferior os botões: salvar, cancelar e excluir.

Nos testes preliminares foram constatadas que após algumas interações de

telas no simulador da plataforma móvel, ocorreu o erro

java.lang.OutOfMemoryError, evidenciando a falta de memória para a criação de

novos objetos. O problema decorreu devido a alocação de memória para cada troca

de tela, ou seja, na interação entre as duas interfaces. A alteração na classe

“Controller”, para manter apenas uma instância para cada objeto da view,

solucionou o erro.

O conteúdo de interface pode ser visualizado na Figura 6 no perfil desktop:

Figura 6. Agenda

3.3.3. Internacionalização

A aplicação necessitou ser dividida em dois projetos, em razão da

compatibilidade com a plataforma mobile, visando a apresentação do recurso de

internacionalização, inexistente no perfil móvel. Deste modo foram construídas duas

Page 40: Javafx

42

aplicações idênticas, uma com o uso da internacionalização e outra não.

Infelizmente devido a bugs encontrados no IDE Netbeans, não foi possível

compartilhar as classes utilizadas em comum a ambos os projetos, sendo

necessário duplicar-las em cada projeto.

A internacionalização é o processo de extração literal, visível ao usuário, a

partir de um programa escrito em uma língua ou cultura, para ser traduzido para

outras línguas e culturas. A localização é o processo se de traduzir um programa

internacionalizado em um ou em vários idiomas específicos ou culturas. O JavaFX

possui ambos os mecanismos, de internacionalização quanto de localização, de

formas simples para o uso (WEAVER, 2009).

Deste modo, no JavaFX o mapeamento é feito através de um arquivo de

internacionalização com a extensão .fxproperties, que deve ser associado a sua

respectiva classe. O formato do nome do arquivo deve obedecer a uma regra: nome

da classe somado a língua seguido do país, separados pelo carácter “_”. A título de

exemplo, no caso da classe ManutencaoContatoView, o recipiente destinado para a

linguagem inglês e país Estados Unidos, foi nomeado como

“ManutencaoContatoView_en_US.fxproperties”.

O conteúdo do arquivo fxproperties demonstra o mapeamento realizado,

conforme pode ser observado no Quadro 7 :

"Manutenção contato" = "Maintaining contact" "Nome" = "Name" "Telefone" = "Phone" "Salvar" = "Save" "Cancelar" = "Cancel" "Excluir" = "Delete" "Cancelar Operação" = "Do you really want to cancel the operation?"

Quadro 7. Arquivo ManutencaoContatoView_en_US.fxpro perties

Os literais que servem como chave ao mapeamento, são referenciados

dentro do código JavaFX recebendo uma sintaxe especial, seguindo o formato

##[<chave>], conforme apresentado no trecho de código extraído da classe

“ManutencaoContatoView” (APÊNDICE D) no Quadro 8 :

Page 41: Javafx

43

... Button { text: ##[Cancelar]"Cancelar" layoutInfo: LayoutInfo {width: larguraBotao}; action: function () { if (Alert.question("Aviso", ##[Cancelar Operação]"Deseja realmente cancelar a operação?")) { controller.moveTelaLista(); } } } ...

Quadro 8. Trecho de código da classe ManutencaoCont atoView

3.3.4. Persistência de dados

A persistência dos dados foi obtida através da classe javafx.io.Storage. Com

o uso desta API, cada aplicação possui separadamente seu espaço compartilhado,

com o acesso exclusivo, permitindo a execução do aplicativo mesmo quando

submetidos em ambientes considerados como programas não confiáveis. Os dados

podem permanecem armazenados até que sejam explicitamente excluídos ou

quando a aplicação é desinstalada (SUN, 2009k).

O Quadro 9 apresenta uma partição da classe “BaseDeDados” (APÊNDICE

E), que demonstra a o carregamento em memória na forma de uma sequência, os

registro previamente persistidos em disco.

... storage = Storage {source: source}; def is = storage.resource.openInputStream(); def dis = new DataInputStream(is); var contatos: Contato[]; try { def qtdeRegistros: Integer = dis.readInt(); contatos = for (i in [1..qtdeRegistros]) { Contato { id: dis.readLong() nome: dis.readUTF() ddd: dis.readInt() telefone: dis.readInt() } } is.close(); } catch (ex: IOException) { ex.printStackTrace(); }...

Quadro 9. Trecho de código da classe BaseDeDados

Page 42: Javafx

44

3.3.5. Integração

A integração com o servidor remoto foi realizada basicamente por meio da

chamada do serviço e consumo do conteúdo XML retornado, com o objetivo de

ilustrar o uso hipotético de um Web Service RESTful.

A classe javafx.io.http.HttpRequest é a API responsável pela requisição

HTTP (Hyper Text Transfer Protocol) assíncrona, utilizada também para a invocação

de Web Services RESTful (SUN, 2009m).

Para a interpretação das informações recebidas foi utilizado um analisador

de dados estruturados (parser) proveniente da classe javafx.data.pull.PullParser,

que fornece uma sequência de eventos para o processamento do documento sob o

controle do aplicativo. Atualmente possui o suporte para os formatos XML e a JSON

(JavaScript Object Notation) (SUN, 2009n).

Por fim, a classe “RequisicaoServidor” (APÊNDICE F) foi implementada

utilizando as APIs anteriormente citadas, com a finalidade de realizar uma

solicitação remota, e decodificar e persistir os dados recebidos pelo servidor, tal

como pode ser observado no trecho de código do Quadro 10 :

... HttpRequest { location: urlServidor onInput: function (inputStream: InputStream) { var contato: Contato; try { var parser: PullParser = PullParser { input: inputStream documentType: PullParser.XML onEvent: function (e: Event) { if ( e.type == PullParser.START_ELEMENT and e.qname.name == "contato") { contato = Contato { id: Long.parseLong(e.getAttributeValue("id")) nome: e.getAttributeValue("nome") ddd: Integer.parseInt(e.getAttributeValue("ddd")) telefone: Integer.parseInt(e.getAttributeValue("telefone")) } agendaDao.salvarOuAtualizaContato(contato); } } }

Page 43: Javafx

45

... Quadro 10. Trecho de código da classe RequisicaoSe rvidor

Nos testes realizados nos dispositivos móveis, o recurso de integração

funcionou no ambiente real. Os registros foram devidamente importados e

persistidos após executar o download do conteúdo XML, disponibilizado em servidor

na Internet.

Neste exemplo, o redimensionamento automático das telas não foi

implementado, por questões de simplicidade. Logo, a altura da interface necessitou

ser readequada após ser testado no HTC P4351, pelo o qual possui o tamanho de

tela inferior ao do simulador. Já no HTC Diamond, cuja resolução é muito maior, a

tela ocupou somente uma pequena parte do espaço disponível em tela.

Em resumo, foi constatado um problema de desempenho no HTC P4351, na

interação dentre as telas de listagem e manutenção dos registros. No HTC

Diamond, pelo o qual possui praticamente o dobro de recursos computacionais em

comparação ao modelo P4351, o tempo de resposta foi bem menor, garantindo

assim, maior performance.

No decorrer dos testes, o programa apresentou alguns problemas com a

persistência de informações, tanto na leitura quanto na escrita dos dados, quando

executado no simulador padrão da plataforma móvel. O defeito encontrado indicou o

corrompimento do arquivo que armazenava as informações, que causava

instabilidades no processo de carregar ou descarregar os dados. A solução adotada

foi excluir manualmente o arquivo de persistência, no caso do exemplo da Agenda,

o caminho foi localizado no C:\Users\<<nome do usuário>>\javafx-sdk\1.2-

b31\work\0\appdb\filesystem\root1\javafxStore\muffin.

Como citado inicialmente, no ambiente Windows Mobile, ocorreram

problemas em tempo de execução relacionadas as mensagens de alertas,

informativas ou exclamativas, derivadas da classe javafx.stage.Alert. Tais

problemas causaram um erro crítico na aplicação, travando inclusive o runtime e o

JVM do JavaFX; sendo assim, somente finalizando manualmente o processo do

JVM foi possível restaurar-lo. Como o problema persistiu em ambos os dispositivos

Page 44: Javafx

46

HTC testados, tal fato sinalizou um possível bug, ainda não catalogado

formalmente.

Page 45: Javafx

47

4. CONCLUSÕES E TRABALHOS FUTUROS

Sendo um dos primeiros trabalhos focados na nova tecnologia JavaFX,

houveram certas dificuldades correlacionadas a obtenção dos materiais e artigos,

embora muitos destes estejam disponíveis como textos oficiais fornecidos pelo

fabricante, o conteúdo ainda apresentou-se muito disperso.

A escassez de trabalhos científicos relacionados ao tema, evidenciou a

necessidade de uma ênfase maior no contexto teórico, logo, tomando grande parte

dos esforços aplicados nesta pesquisa.

O trabalho se concentrou na visão geral até a versão JavaFX 1.2, excluindo

a versão 1.2.1, pelo o qual foi lançado após o término da revisão bibliográfica.

Com relação ao ambiente de desenvolvimento, o IDE Netbeans, adotado

como a ferramenta para a implementação dos exemplos abordados, apresentou-se

ainda pouco maturo, apresentando algumas falhas de recursos básicos do editor,

instabilidades no IDE, dentre outros bugs. No contexto do trabalho, no entanto, não

foram catalogados todos os problemas encontrados.

Em virtude do IDE Netbeans versão 6.8, o último release disponível,

apresentar instabilidades em comparação a sua versão anterior, a 6.7.1, como

defeitos no reconhecimento de classes de bibliotecas de terceiros (por exemplo o

JFXtras), e erros de compilação, ambas as versões, 6.7.1 e 6.8, foram utilizadas em

conjunto para contemplar a implementação dos projetos. Tal fato é justificado

devido as vantagens presentes na nova versão, tendo como destaque o visualizador

prévio da interface a ser gerada, a complementação do código, e dentre outras

melhorias que facilitaram no desenvolvimento dos exemplos.

Do ponto de vista técnico, foram confirmadas muitas semelhanças com a

linguagem Java, como classes, tipos de dados, sintaxe em geral, dentre outras -

tendo em especial - a capacidade de integração com a mesma. Além disso, o uso de

sintaxes declarativas demonstrou que realmente podem promover agilidade no

desenvolvimento de interfaces ricas.

Outro ponto de destaque é o reconhecimento do considerável potencial da

linguagem, através dos recursos de bind, triggers e sintaxes baseadas no SQL, que

Page 46: Javafx

48

utilizadas adequadamente, podem simplificar o processo de implementação de

controles sincronizados com componentes em tela.

Também como fatores importantes foram satisfatórios o desempenho nas

plataformas web e desktop, as formas disponível para implantação de aplicativos na

Internet, e a interação dentre desenvolvedores e artistas através do uso de plugins

para ferramentas gráficas. A segurança herdada do Java, o sandbox pode ser

citado como um dos pontos fundamentais para a implantação remota de aplicações,

garantindo integridade e segurança dos softwares distribuídos pela rede de

computadores.

Quanto a API, como retratado por DODERLEIN, a palheta de componentes

ainda deixaram a desejar, mesmo com a utilização dos controles nativos estendidos

do Swing, ainda podem não apresentar um “arsenal” completo para o

desenvolvimento de interfaces (DOEDERLEIN, 2009a). No entanto, nos perfis

desktop e web, para suprir tais necessidades, é possível realizar a extensão

manualmente de componentes Swing e/ou a incorporação de frameworks de

terceiros, contudo, podendo abdicar de algumas das facilidades da linguagem

declarativa.

Os gerenciadores de leiautes atualmente disponíveis, ainda podem ser

considerados muito simples para construção de interfaces mais complexas, mesmo para o

controle de simples formulários, podem exigir um esforço considerável para o

posicionamento manual e alinhamento dos componentes. Para tanto, para as plataformas

desktop e mobile, é possível também contornar esta deficiência por meio de bibliotecas de

terceiros.

O uso do JavaFX, em primeiro momento, pode não ser indicado para a

implementação de aplicações comerciais de médio ou grande porte. Pode ser

evidente o risco de novas atualizações que promovam alterações na API, ou na

linguagem JavaFX Script, que embora possam aprimorar ou corrigir possíveis falhas

de arquitetura, podem causar impactos indesejáveis na manutenção de um sistema

que já esteja em produção.

A versão atual JavaFX 1.2, ainda pode não ser considerado competitivo

como seus concorrentes, FLEX ou Silverlight, por ausência de alguns recursos

chaves tais como: completos componentes de controle, ambiente de

Page 47: Javafx

49

desenvolvimento visual - essencial para a adesão de leiautistas, e por fim, a falta de

IDEs mais estáveis.

Embora não divulgado formalmente, o próprio compilador ainda pode estar

no estágio beta, conforme pode ser observado em algumas nomenclaturas dos

diretórios do SDK referenciados pelo IDE Netbeans, como exemplo o “1.2-b31” e

“1.2-b603”, que representam respectivamente o JavaFX 1.2 e 1.2.1. Tal indício pode

indicar que o estagio de evolução possivelmente ainda está em testes, portanto a

presença de bugs e instabilidades no ambiente de desenvolvimento, poderiam ser

aceitáveis.

Por fim é importante ressaltar que o presente trabalho focou o JavaFX até o

release 1.2, e versões posteriores a serem lançadas, como o JavaFX 1.3, podem

prometer a inclusão de novos componentes gráficos, gerenciadores de leiaute,

dentre outras melhorias, tais como aprimoramento de desempenho, maior

estabilidade, ambiente de desenvolvimento visual com o lançamento da ferramenta

JavaFX Authoring Tool, além da integração com outras novas plataformas, como

televisores e dispositivos embarcados.

Com trabalhos futuros para a presente pesquisa, é proposto:

• Avaliar a performance dos aplicativos JavaFX através de implementação de

programas focados em testes de desempenho, enfatizando comparações

com seus concorrentes.

• Efetuar estudos sobre a arquitetura do compilador, bem como o mapeamento

de seus principais componentes, com o objetivo de apresentar o

funcionamento e os conceitos envolvidos - explorando suas vantagens e

desvantagens.

• Aprofundar nos conhecimentos na Linguagem JavaFX Script, analisando todo

seu contexto, e a suas melhores práticas. Realizar comparações com outras

linguagens RIAs similares, abordando seus principais aspectos positivos e

negativos.

Page 48: Javafx

50

5. REFERÊNCIAS

[ADOBE, 2009] Visão geral do Flex. Disponível em: <http://www.adobe.com/br/products/flex/overview>. Acesso em 30 de nov. de 2009. [ALLAIRE, 2002] ALLAIRE, Jeremy. Macromedia Flash MX—A next-generation rich client. Disponível em: <http://download.macromedia.com/pub/flash/whitepapers/richclient.pdf>. Acesso em 25 de nov. de 2009. [AUSTIN, 1999] AUSTIN, Calvin; PAWLAN, Monica. Advanced Programming for the Java 2 Platform: Chapter 10: Signed Applets Disponível em: <http://java.sun.com/developer/onlineTraining/Programming/JDCBook/signed.html>. Acesso em 03 de jan. de 2010. [BAIR, 2009] BAIR Richard. Skinning Architecture in JavaFX. Disponível em: <http://fxexperience.com/2009/06/skinning-architecture-in-javafx/>. Acesso em 30 de nov. de 2009. [BOZZON, 2006] BOZZON, Alessandro; FRATERNALI, Piero; COMAI, Sara; CARUGHI, Giovanni Toffetti. Conceptual Modeling and Code Generation for Rich Internet Applications. Disponível em: <http://portal.acm.org/citation.cfm?id=1145581.1145649&coll=GUIDE&dl=GUIDE&CFID=4422105&CFTOKEN=26041127 >. Acesso em 5 de ago. de 2009. [CASTILLO, 2009] CASTILLO, Cindy. Deploy A Rich Internet Application Developed With JavaFX Technology. Disponível em: <http://javafx.com/docs/tutorials/deployment/>. Acesso em 15 de nov. de 2009. [CHO, 2009] CHO, Inyoung. JavaFX 1.2 Technology: Features and Enhancements. Disponível em: <http://javafx.com/docs/articles/javafx1-2.jsp>. Acesso em out. de 2009. [CHOUDHARY, 2009] CHOUDHARY, Vaibhav; HILDEBRANDT, Nancy. JavaFX Applets in the Browser: Learn best practices for deploying JavaFX applications as applets in a browser Disponível em: <http://javafx.com/docs/tutorials/deploy-applet/>. Acesso em 10 de jan. de 2010. [DOEDERLEIN, 2009a] DOEDERLEIN, Osvaldo Pinali. JavaFX: RIA a todo vapor – Apresentando a JavaFX 1.0 e JavaFX Mobile. Java Magazine. Rio de Janeiro: DevMedia Group, v.7, n.67, p. 50-60, mar.. 2009. [DOEDERLEIN, 2009b] DOEDERLEIN, Osvaldo Pinali. Uma “Aplicação Comum” em JavaFX: JavaFX não é só para multimídia e efeitos gráficos. Java Magazine. Rio de Janeiro: DevMedia Group, v.7, n.72, p. 50-60, set. 2009.

Page 49: Javafx

51

[HOMMEL, 2009] HOMMEL, Scott. Lesson 1: Getting Started with JavaFX Script. Disponível em: <http://java.sun.com/javafx/1/tutorials/core/getStarted> Acesso em 13 de nov. de 2009. [KOSTOVAROV, 2009] KOSTOVAROV, Dmitry. Create a Secure JavaFX Application. Disponível em: <http://javafx.com/docs/techtips/Create-Secure-JavaFX-App/index.jsp>. Acesso em 7 de jan. de 2010. [KRILL, 2008] KRILL, Paul. Java SE 6u10 to solve JRE and Java application deployment issues. Disponível em: <http://www.javaworld.com/javaworld/jw-09-2008/jw-09-6u10.html?page=1>. Acesso em 3 de nov. de 2009. [LINAJE, 2008] LINAJE, Marino; PRECIADO, Juan Carlos; MORALES-CHAPARRO, Rober; SANCHEZ-FIGUEROA, Fernando. On the Implementation of Multiplatform RIA User Interface Components. Disponível em: <http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-445/02icwe2008ws-iwwost08-linaje.pdf>. Acesso em 3 de set. de 2009. [MALENKOV, 2009] MALENKOV, Sergey. Weather on SunTechDays. Disponível em: <http://weblogs.java.net/blog/malenkov/archive/2009/04/weather_on_sunt.html>. Acesso em 20 de dez. de 2009. [MAREJKA, 2007] MAREJKA, Richard. JavaFX Mobile - A Little Thing, A Big Step. Disponível em: <http://java.sun.com/javaone/sf/2007/articles/javafxmobile.jsp>. Acesso em out. de 2009. [MORONEY, 2007] MORONEY, Laurence. Introdução ao Silverlight. Disponível em: <http://msdn.microsoft.com/pt-br/library/cc580591.aspx>. Acesso em 30 de nov. de 2009. [NICHOLAS, 2008] NICHOLAS, Ethan. Introducing Java SE 6 update 10. Disponível em: <http://java.sun.com/developer/technicalArticles/javase/java6u10>. Acesso em 17 de out. de 2009. [OLIVER, 2006] OLIVER, Christopher. F3. Disponível em: <http://blogs.sun.com/chrisoliver/entry/f3>. Acesso em out. de 2009. [OLIVER, 2007] OLIVER, Christopher. Welcome. Disponível em: <https://openjfx.dev.java.net/servlets/ReadMsg?list=dev&msgNo=26>. Acesso em 26 de out. de 2009. [OLIVER, 2009] OLIVER, Christopher. From F3 to JavaFX 1.0 - Effects. Disponível em: <http://blogs.sun.com/chrisoliver/entry/from_f3_to_javafx_1>. Acesso em out. de 2009. [O'NEILL, 2007] O'NEILL, Leslie T.. Create rich content applications for mobile, set-top, and desktop devices with JavaFX. Disponível em: <http://www.sun.com/featured-articles/2007-

Page 50: Javafx

52

0508/javafx/index.jsp?intcmp=hp2007may08_javafx_read>. Acesso em 17 de out. de 2009. [OpenFX, 2009a] OpenFX Project Home. Disponível em: <https://openjfx-compiler.dev.java.net>. Acesso em 30 de nov. de 2009. [OpenFX, 2009b] Embeded SQL or LINQ support. Disponível em: <http://jfx.wikia.com/wiki/Embeded_SQL_or_LINQ_support>. Acesso em 30 de nov. de 2009. [O'ROURKE, 2004] O'ROURKE, Cameron. A Look at Rich Internet Applications. Disponível em: <http://wolfpaulus.com/theodore/doc/richinetapp.pdf>. Acesso em 20 de ago. de 2009. [SUN, 2007a] Sun Radically Simplifies Content Authoring - Previews JavaFX Script. Disponível em: <http://www.sun.com/aboutsun/pr/2007-05/sunflash.20070508.2.xml>. Acesso em out. de 2009. [SUN, 2007b] Sun Welcomes SavaJe Technologies. Disponível em: <http://www.sun.com/software/savaje/index.xml>. Acesso em out. de 2009. [SUN, 2007c] Sun Unveils Mobile Software at JavaOne Conference Attended By 15,000 Developers. Disponível em: <http://www.sun.com/aboutsun/pr/2007-05/sunflash.20070508.6.xml>. Acesso em 10 de out. de 2009. [SUN, 2007d] JNLP Support in the New Java™ Plug-In Technology. Disponível em: <https://jdk6.dev.java.net/plugin2/jnlp/>. Acesso em 8 de jan. de 2010. [SUN, 2008a] Sun Microsystems Unveils JavaFX 1.0 with Immersive Media Capabilities Targeted at Market's 800 Million Java Powered Desktops. Disponível em: <http://www.sun.com/aboutsun/pr/2008-12/sunflash.20081204.1.xml>. Acesso em 12 de out. de 2009. [SUN, 2008b] JavaTM SE 6 Update Release Notes. Disponível em: <http://java.sun.com/javase/6/webnotes/6u10.html>. Acesso em 17 de out. de 2009. [SUN, 2009a] Sun Microsystems JavaFX web site. Disponível em: <http://www.sun.com/software/javafx>. Acesso em out. de 2009. [SUN, 2009b] [Sun Releases New Java and JavaFX Software Updates and Previews JavaFX TV; Strong Demand Powers 250 Million JavaFX Downloads. Disponível em: <http://www.sun.com/aboutsun/pr/2009-06/sunflash.20090602.3.xml>. Acesso em out. De 2009. [SUN, 2009c] JavaFX | Rich Internet Applications Development | RIAs Java FX. Disponível em: <http://javafx.com>. Acesso em out. de 2009.

Page 51: Javafx

53

[SUN, 2009d] JavaFX Script – Overview. Disponível em: <http://www.sun.com/software/javafx/script/index.jsp>. Acesso em 17 de out. de 2009. [SUN, 2009e] Software and System Requirements for JavaFX Technology. Disponível em: <http://java.sun.com/javafx/1/reference/system-requirements-1-2.html>. Acesso em 3 de nov. de 2009. [SUN, 2009f] JavaFX 1.1 Production Suite Release Notes. Disponível em: <http://java.sun.com/javafx/1/reference/releasenotes/production-suite-release-notes-1-1.html>. Acesso em 5 de nov. de 2009. [SUN, 2009g] OEM Early Access. Disponível em: <http://www.sun.com/oem/eda.jsp>. Acesso em 7 de nov. de 2009. [SUN, 2009h] Integrate Graphic Assets Into Your JavaFX. Application. Disponível em: <http://javafx.com/docs/integrate-graphic-assets>. Acesso em 30 de nov. de 2009. [SUN, 2009i] JavaFX Graphics Files (FXZ, FXD). Disponível em: <http://javafx.com/docs/integrate-graphic-assets/Fileformats.jsp>. Acesso em 30 de nov. de 2009. [SUN, 2009j] General Questions. Disponível em: <http://javafx.com/faq/>. Acesso em 10 de agos. de 2009. [SUN, 2009k] JavaFX 1.2.1 API, javafx.io.Storage. Disponível em: <http://java.sun.com/javafx/1.2/docs/api/javafx.io/javafx.io.Storage.html>. Acesso em 5 de jan. de 2010. [SUN, 2009l] JavaFX™ Mobile 1.2 for Windows Mobile OS Release Notes. Disponível em: <http://www.javafx.com/downloads/mobile/ReleaseNotes.pdf>. Acesso em 25 de nov. de 2009. [SUN, 2009m] JavaFX 1.2.1 API, javafx.io.http.HttpRequest. Disponível em: <http://java.sun.com/javafx/1.2/docs/api/javafx.io.http/javafx.io.http.HttpRequest.html>. Acesso em 15 de dez. de 2009. [SUN, 2009n] JavaFX 1.2.1 API, javafx.data.pull.PullParser. Disponível em: <http://java.sun.com/javafx/1.2/docs/api/javafx.data.pull/javafx.data.pull.PullParser.html>. Acesso em 15 de dez. de 2009. [SUN, 2009o] Signing and Verifying JAR Files. Disponível em: <http://java.sun.com/docs/books/tutorial/deployment/jar/signindex.html>. Acesso em 11 de jan. de 2010. [WEAVER, 2009] WEAVER, James L.; GAO, Weiqi; CHIN, Stephen; IVERSON, Dean. Pro JavaFX™ Platform: Script, Desktop and Mobile RIA with Java™ Technology. Berkeley: Apress, 2009. 544 p.

Page 52: Javafx

54

[ZUKOWSKI, 2002] ZUKOWSKI, John. Deploying Software with JNLP and Java Web Start. Disponível em: <http://java.sun.com/developer/technicalArticles/Programming/jnlp/>. Acesso em 15 de set. de 2009.

Page 53: Javafx

55

6. BIBLIOGRAFIA CONSULTADA

[1] HOMMEL, Scott. Learning the JavaFX Script Programming Language - Tutorial Overview. Disponível em: <http://java.sun.com/javafx/1/tutorials/core>. Acesso em 15 de agos. de 2009. [2] REDKO, Alla. Building GUI Applications With JavaFX. Disponível em: <http://java.sun.com/javafx/1/tutorials/ui/overview/index.html>. Acesso em 15 de dez. de 2009. [3] PILGRIM, Peter. Enterprise Java FX for the Web Platform. Disponível em: <http://www.infoq.com/presentations/Java-FX-Peter-Pilgrim>. Acesso em 21 de set. de 2009. [4] HEINRICHS, Michael. JavaFX Mobile Applications — Best Practices for Improving Performance. Disponível em: <http://java.sun.com/developer/technicalArticles/javafx/mobile/>. Acesso em 7 de jan. de 2010. [5] GALPIN, Michael. Creating mashups with JavaFX. Disponível em: <http://www.ibm.com/developerworks/web/library/wa-javafx/>. Acesso em 20 de dez. de 2009.

Page 54: Javafx

56

7. APÊNDICES

Page 55: Javafx

57

7.1. APÊNDICE A - Código Fonte do primeiro exemplo

package primeiroprojeto; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.text.Text; import javafx.scene.text.Font; import javafx.scene.control.Button; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.FontWeight; import javafx.stage.Alert; import javafx.geometry.HPos; import java.util.Date; Stage { title: "Primeiro Projeto" var cena: Scene = Scene { fill: Color.AQUAMARINE width: 250 height: 250 var vbox: VBox content: [ vbox = VBox { spacing: 20 nodeHPos: HPos.CENTER layoutX: bind (cena.width - vbox.layoutBounds.width) /2 content: [Text { font: Font.font("Arial", FontWeight.BOLD, 20) content: "JavaFX" } Button { text: "Botão" action: function () { var dataAtual = new Date(); if("{__PROFILE__}" != "mobile") Alert.inform("Informação", "Alô Mundo! {dataAtual}"); } } ] } ] } scene : cena }

Page 56: Javafx

58

7.2. APÊNDICE B – Código fonte da classe InterfaceP adraoView

package view; import javafx.scene.Node; import javafx.scene.layout.VBox; import javafx.scene.control.Button; import javafx.scene.control.TextBox; import javafx.scene.layout.HBox; import javafx.scene.layout.LayoutInfo; import javafx.scene.layout.Tile; def tamanhoBotao = 50; def numerosDe1a9 = ["7", "8", "9", "4", "5", "6", "1", "2", "3"]; def operadoresCantoSuperior = ["/", "*", "-"]; public class InterfacePadraoView extends CalculadoraView { override protected function create(): Node { VBox { layoutX: 20 content: [ HBox { content: [TextBox { text: bind controller.textoDisplay columns: 12 editable: false layoutInfo: LayoutInfo {width: 203 height: 40} selectOnFocus: false } ] } Tile { columns: 4 rows: 1 tileHeight: tamanhoBotao tileWidth: tamanhoBotao vgap: 1 hgap: 1 content: [ Button { text: "C" id: "idC" styleClass: "botoesTecla" onMouseClicked: controller.onMouseClickedBotaoC onKeyPressed: controller.onKeyPressedCalculadora; }

Page 57: Javafx

59

for (operador in operadoresCantoSuperior) { Button { text: operador id: "id{operador}" onMouseClicked: controller.onMouseClickedBotaoOperador onKeyPressed: controller.onKeyPressedCalculadora; styleClass: "botoesTecla" } } ] } HBox { content: [ VBox { content: [ Tile { columns: 3 rows: 3 tileHeight: tamanhoBotao tileWidth: tamanhoBotao vgap: 1 hgap: 1 content: [ for (numero in numerosDe1a9) { Button { text: numero id: "id{numero}" styleClass: "botoesTecla" onMouseClicked: controller.onMouseClickedBotaoNumerico onKeyPressed: controller.onKeyPressedCalculadora; } } ] } HBox { spacing: 1 content: [ Button { layoutInfo: LayoutInfo {height: tamanhoBotao width: tamanhoBotao * 2} text: "0" id: "id0" styleClass: "botoesTecla" onMouseClicked: controller.onMouseClickedBotaoNumerico onKeyPressed: controller.onKeyPressedCalculadora; } Button {

Page 58: Javafx

60

layoutInfo: LayoutInfo {height: tamanhoBotao width: tamanhoBotao} text: "." styleClass: "botoesTecla" onMouseClicked: controller.onMouseClickedBotaoPonto onKeyPressed: controller.onKeyPressedCalculadora; } ] } ] } Tile { columns: 1 rows: 2 tileHeight: tamanhoBotao * 2 tileWidth: tamanhoBotao vgap: 2 hgap: 1 content: [ Button { text: "+" id: "id+" styleClass: "botoesTecla" onMouseClicked: controller.onMouseClickedBotaoOperador onKeyPressed: controller.onKeyPressedCalculadora; } Button { text: "=" id: "id=" styleClass: "botoesTecla" onMouseClicked: controller.onMouseClickedBotaoIgual onKeyPressed: controller.onKeyPressedCalculadora; } ] } ] } ] } } }

Page 59: Javafx

61

7.3. APÊNDICE C – Código fonte da classe Controller

package calculadorafx; import calculadora.Calculadora; import calculadora.Operacao; import javafx.scene.input.KeyEvent; import java.util.Map; import javafx.scene.input.KeyCode; import java.util.HashMap; import javafx.scene.input.MouseEvent; import java.lang.NumberFormatException; public class Controller { var op1: Double; var op2: Double; public-read var textoDisplay: String; var operador: Operacao; var calculadora: Calculadora; var mapaBotoesNumericos: Map; var mapaBotoesOperadores: Map; var mapaTeclasNumericas: Map; var mapaTeclasNumPad: Map; var mapaTeclasOperadores: Map; var isDecimal: Boolean; var operacaoSinalizada: Boolean = false; postinit { operador = null; calculadora = Calculadora {}; def numeros = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]; def idsBotoesNumericos = ["id1", "id2", "id3", "id4", "id5", "id6", "id7", "id8", "id9", "id0"]; def idsBotoesOperadores = ["id+", "id-", "id*", "id/"]; def teclasNumericas = [KeyCode.VK_1, KeyCode.VK_2, KeyCode.VK_3, KeyCode.VK_4, KeyCode.VK_5, KeyCode.VK_6, KeyCode.VK_7, KeyCode.VK_8, KeyCode.VK_9, KeyCode.VK_0]; def teclasOperadores = [KeyCode.VK_ADD, KeyCode.VK_SUBTRACT, KeyCode.VK_MULTIPLY, KeyCode.VK_DIVIDE]; def operadores = Operacao.values(); def teclasNumPad = [KeyCode.VK_NUMPAD1, KeyCode.VK_NUMPAD2, KeyCode.VK_NUMPAD3, KeyCode.VK_NUMPAD4, KeyCode.VK_NUMPAD5, KeyCode.VK_NUMPAD6, KeyCode.VK_NUMPAD7, KeyCode.VK_NUMPAD8, KeyCode.VK_NUMPAD9, KeyCode.VK_NUMPAD0];

Page 60: Javafx

62

mapaBotoesNumericos = new HashMap(); mapaBotoesOperadores = new HashMap(); mapaTeclasNumericas = new HashMap(); mapaTeclasOperadores = new HashMap(); mapaTeclasNumPad = new HashMap(); for (i in [0..9]) { mapaBotoesNumericos.put(idsBotoesNumericos[i], numeros[i]); mapaTeclasNumericas.put(teclasNumericas[i], numeros[i]); mapaTeclasNumPad.put(teclasNumPad[i], numeros[i]); } for (i in [0..3]) { mapaBotoesOperadores.put(idsBotoesOperadores[i], operadores[i]); mapaTeclasOperadores.put(teclasOperadores[i], operadores[i]); } } public function calcula(): Double { return if (operador == Operacao.SOMA) { calculadora.soma(op1, op2); } else if (operador == Operacao.SUBTRACAO) { calculadora.subtrai(op1, op2); } else if (operador == Operacao.MULTIPLICACAO) { calculadora.multiplica(op1, op2); } else if (operador == Operacao.DIVISAO) { calculadora.divide(op1, op2); } else { 0 } } public function onMouseClickedBotaoC(e: MouseEvent): Void { textoDisplay = ""; isDecimal = false; operador = null; } public function onMouseClickedBotaoNumerico(e: MouseEvent): Void { controlaDisplay(mapaBotoesNumericos.get(e.node.id) as String); } function controlaDisplay(numeroDigitado: String) { if ("null".equals(numeroDigitado)) { return ; } if (operacaoSinalizada) {

Page 61: Javafx

63

textoDisplay = numeroDigitado; operacaoSinalizada = false; } else { textoDisplay += numeroDigitado; } } function onKeyPressedBotaoNumerico(e: KeyEvent): Void { var teclaPressionada = mapaTeclasNumericas.get(e.code) as String; teclaPressionada = if (teclaPressionada != null) "{teclaPressionada}" else "{mapaTeclasNumPad.get(e.code)}"; controlaDisplay(teclaPressionada); } function onKeyPressedBotaoOperador(e: KeyEvent): Void { def testeOperador: Operacao = mapaTeclasOperadores.get(e.code) as Operacao; if (testeOperador == null or textoDisplay.equals("")) { return ; } operador = testeOperador; sinalizaOperador(); } public function onKeyPressedCalculadora(e: KeyEvent): Void { this.onKeyPressedBotaoNumerico(e); this.onKeyPressedBotaoOperador(e); if (e.code == KeyCode.VK_DECIMAL) { this.onMouseClickedBotaoPonto(null); } else if (e.code == KeyCode.VK_ENTER) { this.onMouseClickedBotaoIgual(null); } } public function onMouseClickedBotaoOperador(e: MouseEvent): Void { if (textoDisplay.equals("")) { return ; }

Page 62: Javafx

64

operador = mapaBotoesOperadores.get(e.node.id) as Operacao; sinalizaOperador(); } function sinalizaOperador() { if (operador == null) { return ; } try { op1 = Double.parseDouble(textoDisplay); operacaoSinalizada = true; } catch (nfe: NumberFormatException) { operador = null; } } public function onMouseClickedBotaoPonto(e: MouseEvent): Void { if (not isDecimal) { isDecimal = true; if (textoDisplay.equals("")) { textoDisplay = "0"; } textoDisplay += "."; } } function reiniciar() { isDecimal = true; operador = null; } public function onMouseClickedBotaoIgual(e: MouseEvent): Void { if (operador == null) { return ; } try { op2 = Double.parseDouble(textoDisplay); } catch (nfe: NumberFormatException) { operador = null; return ; } textoDisplay = "{calcula()}"; reiniciar(); } }

Page 63: Javafx

65

7.4. APÊNDICE D – Código fonte da classe Manutenca oContatoView

package gui; import entidade.Contato; import javafx.scene.control.TextBox; import javafx.scene.layout.VBox; import javafx.scene.layout.HBox; import javafx.scene.control.Label; import javafx.scene.layout.Panel; import javafx.geometry.HPos; import javafx.scene.control.Button; import java.lang.NumberFormatException; import javafx.stage.Alert; import javafx.scene.layout.LayoutInfo; import javafx.geometry.VPos; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; def larguraBotao = 70; public class ManutencaoContatoView extends AgendaView { public var contato: Contato on replace { inicializaTela(); } var tfNome: TextBox; var tfDdd: TextBox; var tfTelefone: TextBox; function inicializaTela() { tfNome.text = "{contato.nome}"; tfDdd.text = "{contato.ddd}"; tfTelefone.text = "{contato.telefone}"; } function salvar() { contato.nome = tfNome.text; try { contato.ddd = Integer.valueOf(tfDdd.text); contato.telefone = Integer.valueOf(tfTelefone.text); } catch (nfe: NumberFormatException) { Alert.inform("Erro", "Telefone Inválido"); } controller.salvar(contato);

Page 64: Javafx

66

} override def content = VBox { content: [ HBox { content: [ Label { layoutInfo: LayoutInfo {width: Controller.larguraTela, height: 50} text: ##[Manutenção contato]"Manutenção contato" font: Font.font("Arial", FontWeight.DEMI_BOLD, 18) hpos: HPos.CENTER } ] } Panel { layoutInfo: LayoutInfo {width: Controller.larguraTela height: 230} content: [ Label { layoutX: 8 layoutY: 4 text: ##[Nome]"Nome:" } tfNome = TextBox { layoutX: 69 layoutY: 4 text: "" columns: 14 selectOnFocus: false } Label { layoutX: 8 layoutY: 34 text: ##[Telefone]"Telefone:" } tfDdd = TextBox { layoutX: 69 layoutY: 34 text: "" columns: 2 selectOnFocus: true } tfTelefone = TextBox { layoutX: 119 layoutY: 34 text: "" columns: 8 selectOnFocus: true }

Page 65: Javafx

67

] } HBox { vpos: VPos.BOTTOM spacing: 10 content: [ Button { text: ##[Salvar]"Salvar" layoutInfo: LayoutInfo {width: larguraBotao}; action: function () { salvar(); } } Button { text: ##[Cancelar]"Cancelar" layoutInfo: LayoutInfo {width: larguraBotao}; action: function () { if (Alert.question("Aviso", ##[Cancelar Operação]"Deseja realmente cancelar a operação?")) { controller.moveTelaLista(); } } } Button { text: ##[Excluir]"Excluir" layoutInfo: LayoutInfo {width: larguraBotao}; action: function () { if (controller.remover(contato)) { controller.moveTelaLista(); } } } ] } ] } }

Page 66: Javafx

68

7.5. APÊNDICE E – Código fonte da classe BaseDeDado s

package persistencia; import entidade.Contato; import javafx.io.Storage; import java.io.DataInputStream; import java.io.IOException; import java.io.DataOutputStream; def source: String = "Agendas"; public class BaseDeDados { var storage: Storage; public function lerTodos(): Contato[] { if (Storage.list() == null) { return null; } storage = Storage {source: source}; def is = storage.resource.openInputStream(); def dis = new DataInputStream(is); def qtdeRegistros: Integer = dis.readInt(); var contatos: Contato[] = for (i in [1..qtdeRegistros]) { Contato { id: dis.readLong() nome: dis.readUTF() ddd: dis.readInt() telefone: dis.readInt() } } try { is.close(); } catch (ex: IOException) { ex.printStackTrace(); } return contatos; } public function salvar(contatos: Contato[]) { storage = Storage {source: source};

Page 67: Javafx

69

def os = storage.resource.openOutputStream(true); def dos = new DataOutputStream(os); try { dos.writeInt(sizeof contatos); for (c in contatos) { dos.writeLong(c.id); dos.writeUTF(c.nome); dos.writeInt(c.ddd); dos.writeInt(c.telefone); } dos.close(); } catch (ex: IOException) { ex.printStackTrace(); } } }

Page 68: Javafx

70

7.6. APÊNDICE F – Código fonte da classe Requisicao Servidor

package integracao; import javafx.io.http.HttpRequest; import java.io.InputStream; import persistencia.AgendaDao; import javafx.data.pull.PullParser; import javafx.data.pull.Event; import entidade.Contato; import javafx.async.RunnableFuture; def urlServidor = "http://localhost:8084/servicoAgendaFX/contatos"; public class RequisicaoServidor extends RunnableFuture { public-init var agendaDao: AgendaDao; override public function run(): Void { HttpRequest { location: urlServidor onInput: function (inputStream: InputStream) { var contato: Contato; try { var parser: PullParser = PullParser { input: inputStream documentType: PullParser.XML onEvent: function (e: Event) { if (e.type == PullParser.START_ELEMENT and e.qname.name == "contato") { contato = Contato { id: Long.parseLong(e.getAttributeValue("id")) nome: e.getAttributeValue("nome") ddd: Integer.parseInt(e.getAttributeValue("ddd")) telefone: Integer.parseInt(e.getAttributeValue("telefone")) } agendaDao.salvarOuAtualizaContato(contato); } } } parser.parse(); } finally { inputStream.close(); } } }.start();

Page 69: Javafx

71

} }

Page 70: Javafx

72

8. ANEXOS

Palavras reservadas

abstract into this after inverse throw and last trigger as lazy true assert mod try at new tween attribute not typeof before null var bind on where bound or while break override with catch package this class postinit throw continue private trigger def protected true delete public-init try else public tween exclusive public-read typeof extends replace var false return where finally reverse while first sizeof with for static this from step throw