JavaFX Script
Introdução
Fábio Nogueira de Lucena
Instituto de Informática (UFG)
Graduação em Engenharia de Software
http://engenhariadesoftware.inf.br
“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”
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
Importante
• Tudo o que existe em Java pode ser
reutilizado em JavaFX
• Você poderá reutilizar suas
classes Java!
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
Object literal
• Em Java
Rectangle r = new Rectangle();
r.width = 10;
r.height = 5;
• Em JavaFX
Rectangle {
width : 10
height: 5
}
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"
}
}
}
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
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
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...
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;
Tipos (implícitos)
// var boolean : Boolean = true;
// é o mesmo que...
var boolean = true;
// var int : Integer = 4;
// é o mesmo que ...
var int = 4;
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?
Constantes
var (variável)
def (constante)
// Variável
var logica : Boolean = false;
// CONSTANTE
def pi = 3.1415926536;
println(“Valor: {pi}”);
Á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
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
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
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
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!
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
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:
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...
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:
Nem sempre...
sequências são explicitamente
criadas por meio de seus
elementos separados por
vírgulas, nestes casos, ...
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
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
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:
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:
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
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());
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
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
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]
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]
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]
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
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
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
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
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];
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]
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 ]
Ú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:
Funções úteis
javafx.util.Sequences
binarySearch
indexByIdentity
indexOf
isEqualByContentIdentity
max
min
nextIndexByIdentity
nextIndexf
reverse
shuffle
sort
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
Expressões
Trecho de código em JavaFX Script
que o compilador é capaz de compreender
10;
{
10;
}
Expressões equivalentes do tipo Integer
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
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
While
Executar bloco de código
enquanto condição for verdadeira
var x = 1;
while (x < 10) {
print(“ {x}”);
x++;
}
Resultado:
123456789
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 ]
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
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
O que ainda falta?
• object literal
• binding
• gráficos
• API Não perca...