Este documento introduz o JavaFX Script, que é uma linguagem de programação para desenvolvimento de aplicações JavaFX. Ele apresenta alguns dos principais componentes do JavaFX, como a API, o JavaFX Script e o SDK, e fornece links para obter mais informações. Além disso, destaca que classes Java podem ser reutilizadas em aplicações JavaFX.
1. JavaFX Script
Introdução
Fábio Nogueira de Lucena
Instituto de Informática (UFG)
Graduação em Engenharia de Software
http://engenhariadesoftware.inf.br
3. “Habilidade para criar conteúdo interativo,
aplicações e serviços a serem executados do
computador de mesa aos dispositivos da sala
de estar”
“Experiências de internet ricas para todas as
telas da sua vida”
7. Alguns links
• http://javafx.com
• http://java.sun.com/javafx
• http://www.javapassion.com/javafx/
• Esta e outras apresentações (slides):
http://www.slideshare.net/kyrios
8. Importante
• Tudo o que existe em Java pode ser
reutilizado em JavaFX
• Você poderá reutilizar suas
classes Java!
10. Comentários
• Comentário (múltiplas linhas)
/* Comentário que se estende
por mais de uma linha.
*/
• Comentário (uma única linha)
// Até o final da linha
11. Object literal
• Em Java
Rectangle r = new Rectangle();
r.width = 10;
r.height = 5;
• Em JavaFX
Rectangle {
width : 10
height: 5
}
13. Primeiro exemplo
package jfx1;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.*;
/* Main.fx
*/
Stage {
title: "Título da Aplicação (janela)"
width: 250
height: 80
scene: Scene {
content: Text {
font : Font { size : 16 }
x: 10, y: 30
content: "Meu primeiro teste"
}
}
}
14. Como obtê-lo?
• Repositório dos exemplos
http://exemplos.googlecode.com/svn/trunk/javafx
• Comando para obter localmente?
(cria diretório jfx1 a partir do repositório)
svn export <url-acima>/jfx1 jfx1
15. Como compilar e
executar?
• Vá jfx1 o diretório criado
cd
para
• Compilação
javafxc -d ~/tmp src/jfx1/Main.fx
• Execução-cp
javafx ~/tmp jfx1.Main
16. Se o resultado for...
• Especifique o encoding pertinente ao arquivo fonte
(no momento da compilação)
javafxc -d ~/tmp -encoding ISO-8859-1 src/jfx1/Main.fx
• Ao executar o~/tmp jfx1.Main
javafx -cp
resultado da compilação anterior
• O resultado...
18. Variáveis e tipos
(explícitos)
var boolean: Boolean = true;
var byte: Byte = 2;
var short: Short = 3;
var int:Integer = 4;
var long: Long = 5;
var float: Float = 1.2;
var double: Double = 2.0;
19. Tipos (implícitos)
// var boolean : Boolean = true;
// é o mesmo que...
var boolean = true;
// var int : Integer = 4;
// é o mesmo que ...
var int = 4;
21. Exemplo Boolean
// Pacote: javafx.lang
// Classe FX (vários métodos static)
var logica : Boolean = false;
FX.println(“Valor: {not logica}”);
// OU
println(“Valor: {not logica}”);
Notou que não houve concatenação explícita?
22. Constantes
var (variável)
def (constante)
// Variável
var logica : Boolean = false;
// CONSTANTE
def pi = 3.1415926536;
println(“Valor: {pi}”);
23. Área de um círculo
var (variável)
def (constante)
// Arquivo: x.fx
// Área pi * raio * raio
def pi = 3.1415926536;
def raio = 2; // Dois metros
println(“Área: {pi*raio*raio}m2”);
Este código é compilável e executável!
$ javafxc x.fx
$ javafx x
24. Volume de um cilindro
// Área pi * raio * raio
def pi = 3.1415926536;
def raio = 2; // Dois metros
var area = pi * raio * raio;
var altura = 1; // 1 metro
var volume = area * altura * 1000;
def (constante)
var (variável)
println(“Volume: {volume} litros”);
Este código é compilável e executável!
$ javafxc x.fx
$ javafx x
25. String (“ ou ‘)
def name : String = “Nome”;
“string” ou ‘s tring’
var nAme = ‘Nome’;
var iguais = ‘{name == nAme}’;
// Imprime
// Iguais?: true
print(“Iguais?: {iguais}”);
Este código é compilável e executável!
$ javafxc x.fx
$ javafx x
26. String (múltiplas linhas)
“s t
var name = “Pedro ” r i ng
‘Álvares’ ”o
u ‘s
“string” ou ‘s tring’
“ Cabral”; tri
ng
’
// Imprime
// Pedro Álvares Cabral
print(name);
Este código é compilável e executável!
$ javafxc x.fx
$ javafx x
27. Duration
Detalhes em javafx.lang.Duration
var horas = 0h;
var minutos = 1m;
var segundos = 1s;
var milissegundos = 1ms;
var parcial = horas + milissegundos;
print(parcial + minutos + segundos);
Este código é compilável e executável!
28. Sequência é uma coleção
de objetos ordenados
• É declarada com colchetes ([ e ])
• Uma sequência é linear, não existem
sequências multidimensionais
• Sequências são iguais se possuírem o
mesmo tamanho e os mesmos valores nas
mesmas ordens
• Notação: tipo seguido de []
(por exemplo, Integer[])
• sizeof recupera o tamanho da
sequência
29. Sequências
Sequence é uma lista ordenada
de elementos de um mesmo tipo
var lista = [-1, 0, 1];
def ordenada = [ false, true, true ];
var mesmoTipo = [ ‘A’, “ Janela” ];
println(lista);
println(ordenada);
println(mesmoTipo);
Nenhuma surpresa:
30. Sequências
Sequence é uma lista ordenada
de elementos de um mesmo tipo
var ints : Integer[] = [1, 2,3];
def bs : Boolean[]=[false];
def vazia=[];
println(ints);println(bs);println(vazia);
Nada espetacular...
31. Sequências
Sequence é uma lista ordenada
de elementos de um mesmo tipo
// Vírgula como separador
var strs = [ “ok”, ‘correto’ ];
println(strs);
Aplicação de 3 linhas:
32. Nem sempre...
sequências são explicitamente
criadas por meio de seus
elementos separados por
vírgulas, nestes casos, ...
33. Faixas (sequências numéricas)
Step padrão é
1 ou 1.0 dependendo do tipo do elemento
var ints = [1..5]; // step é 1
println(ints);
var ns = [ 1.0..1.3 step 0.1];
println(ns);
Arquivo n.fx é compilado
n (do nome do arquivo) é executada
34. Faixas (sequências numéricas)
Step padrão é
1 ou 1.0 dependendo do tipo do elemento
println([1..<5]); // 1 a 4
println([4..1 step -1]); // 4 a 1
println([10..1]); // [ ]
println(sizeof [1..67]); // 67
35. Sequências não podem conter sequências
Uma sequência contém apenas objetos
Uma sequência não é um objeto!
var inicio = 1;
var fim = 9;
var p = 2;
var impares = [inicio..fim step p];
var pares = [(inicio+1)..(fim+1) step p];
var todos = [ impares, pares ];
println(todos);
Elementos são concatenados:
36. Sequências não podem conter sequências
Uma sequência contém apenas objetos
Uma sequência não é um objeto!
import javafx.util.Sequences;
var impares = [1..9 step 2];
var pares = [2..10 step 2];
println(Sequences.sort([impares,pares]));
Elementos são concatenados e ordenados:
37. Convertendo para String
Sequence é uma lista ordenada
de elementos de um mesmo tipo
var bytes : Byte[] = [2..1 step -1];
println(bytes);
println(“{bytes}”);
println(“{[5..0 step -1]}”);
Saídas produzidas
38. O que você já sabe?
Sequence é uma lista ordenada
de elementos de um mesmo tipo
javafxc compila arquivo .fx
javafx executa
A linha abaixo é compilável e executável!
println(new java.util.Date());
39. Leia mentalmente...
• Obter o tamanho de uma sequence
• Recuperar um único elemento
• Recuperar uma faixa de elementos
consecutivos
• Recuperar subconjunto de elementos
não consecutivos que satisfazem
critérios de busca
• Inverter a ordem
• Inserir/remover um elemento
40. Tamanho (sizeof)
sizeof também pode ser empregado
para tipos primitivos (retorna 1)
var ints = [ 2..10000 ];
println(sizeof ints); // 9999
sizeof usado também com referência
(retorna 1 se não for null ou 0 para null)
var integer : Integer;
var ref : javafx.scene.shape.Rectangle;
println(sizeof integer); // 1
println(sizeof ref); // 0
41. Acesso a elemento
nome de sequence ou expressão que resulta em
sequence seguido de [indice]
var ints = [ 2..10000 ];
ints[3] = 2;
println(ints[-14]); // Imprime 0
println([1, 3][1]); // Imprime 3
println(ints[4]); // Imprime 6
// Imprime true
println(ints[2*10000] == ints[-1]);
[indice]
42. Acesso a segmento
nome de sequence ou expressão que resulta em
sequence seguido de:
print([1..5][0..]); // todos
print([1..5][0..<1]); // [ 1 ]
print([1..5][0..0]); // [ 1 ]
print([1..5][2..<]); // [ 3, 4 ]
print([1..5][3..4]); // [ 4, 5 ]
[índice]
43. Segmento por predicado
Elementos não necessariamente consecutivos
são selecionados, basta satisfazer condição
var ns = [1..5];
print(ns[x | x < 6]); // todos
print(ns[y | y == 4]); // [ 4 ]
print(ns[z | z*z == 4]); // [ 2 ]
print(ns[varX | true]); // todos
// Imprime [ 1, 3, 5 ] (índices pares)
print(ns[k | indexof k mod 2 == 0]);
print(ns[par | par mod 2 == 0]); // Pares
[valores da sequência]
44. Invertendo ordem
Não modifica a sequência original, produz
outra que contém os mesmos elementos,
mas na ordem inversa
var ns = [1..5];
var sn = [5..1 step -1];
print(reverse ns); // [ 5, 4, ...
print(reverse ns == sn); // true
reverse ns
Uma outra sequência é criada
46. insert into
Modifica a sequência original
Insere um valor no final de uma sequência
var ns = [1..3];
insert 10 into ns;
print(ns); // [ 1, 2, 3, 10 ]
insert x into sequencia;
Valor x é inserido no final de sequencia
47. insert before
Modifica a sequência original
Insere valor em sequência
antes do índice fornecido
var ns = [1..3]; // [ 1, 2, 3 ]
insert -1 before ns [2];
print(ns); // [ 1, 2, -1, 3 ]
insert -1 before ns[0];
print(ns); // [ -1, 1, 2, -1, 3 ]
insert x before sequencia [indice];
Valor x é inserido em sequencia antes
de indice
48. insert after
Modifica a sequência original
Insere valor em sequência
após o índice fornecido
var ns = [1..3];
insert -1 after ns [2];
print(ns); // [ 1, 2, 3, -1 ]
insert -1 after ns[-1];
print(ns); // [ -1, 1, 2, 3, -1 ]
insert x after sequencia [indice];
Valor x é inserido em sequencia após
indice
49. Inserir sequência em sequência
Modifica a sequência original
insert into, insert before e insert after
var pares1 = [1..5][x | x mod 2 == 0];
var pares2 = pares1;
var pares3 = pares1;
var impares = [1..3][x | x mod 2 != 0];
// [ 2, 4, 1, 3 ]
insert impares into pares1;
// [ 1, 3, 2, 4 ]
insert impares before pares2 [0];
// [ 2, 1, 3, 4 ]
insert impares after pares3 [0];
50. Removendo elementos
Modifica a sequência original
delete valor from sequência
delete sequência [índice]
var ints = [1..10];
delete 1 from ints; // [ 2,3,4,5,6,7,8,9,10 ]
delete 3 from ints; // [ 2,4,5,6,7,8,9,10 ]
delete ints [2]; // [ 2,4,6,7,8,9,10 ]
delete ints [3]; // [ 2,4,6,8,9,10 ]
delete ints [4..4]; // [ 2,4,6,8,10 ]
delete ints [5]; // [ 2,4,6,8,10 ]
println(ints);
delete x from sequencia
delete sequencia [índice]
51. Sequence comprehension
Criando sequências com uso do for
var ints = for (x in [1..2]) x*x;
println(ints); // [ 1, 4 ]
var ns = for (x in [1..2] where x > 1) x;
println(ns); // [ 2 ]
def AA = [ 1, 2 ];
def BB = [ 3, 4 ];
var matriz = for (a in AA, b in BB) a*10 + b;
println(matriz); // [ 13, 14, 23, 24 ]
52. Última sentença do for
(define o valor)
Criando sequências com uso do for
var ints = for (x in [1..2]) {
println(x);
x*x;
};
println(ints);
Resultado:
53. Funções úteis
javafx.util.Sequences
binarySearch
indexByIdentity
indexOf
isEqualByContentIdentity
max
min
nextIndexByIdentity
nextIndexf
reverse
shuffle
sort
55. Expressões
Trecho de código em JavaFX Script
que o compilador é capaz de compreender
println([1..10]);
{
println([1..10]);
}
Expressões equivalentes do tipo void
56. Expressões
Trecho de código em JavaFX Script
que o compilador é capaz de compreender
10;
{
10;
}
Expressões equivalentes do tipo Integer
57. Atribuições
Trecho de código em JavaFX Script
que o compilador é capaz de compreender
var x = 10;
var y = {
10;
}
var z = {
def a = 5;
def b = 2;
a * b;
}
Atribuições envolvendo
expressões equivalentes do tipo Integer
58. Atribuições
Trecho de código em JavaFX Script
que o compilador é capaz de compreender
var x = 10;
var y = {
println(x);
x + 10; // ; é opcional aqui
}
println(y);
Atribuições envolvendo
expressões do tipo Integer
59. While
Executar bloco de código
enquanto condição for verdadeira
var x = 1;
while (x < 10) {
print(“ {x}”);
x++;
}
Resultado:
123456789
60. For
Executar bloco de código
enquanto condição for verdadeira
var y = for (x in [1..10]) {
print(“ {x}”);
“a{x*x}”
}
println(“ “);
println(y);
Resultado:
1 2 3 4 5 6 7 8 9 10
[ a1, a4, a9, a16, a25, a36, a49, a64, a91, a100 ]
61. if
Executar bloco de código
conforme avaliação de condição
var x = 1;
println(“{if (x>0) then x+3 else x-10}”);
Resultado:
4
62. if
Executar bloco de código
dependendo de avaliação de condição
var x = 1;
var y = if (x < 0) then “a” else “b”;
println(“Resultado: {y}”);
O que é produzido?
Resultado: b
63. O que ainda falta?
• object literal
• binding
• gráficos
• API Não perca...