Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Introduzione a JavaFX

Programmare con Java FX script e applicazioni cross-platform
Programmare con Java FX script e applicazioni cross-platform
Link copiato negli appunti

Da Sun e dal mondo Java, spesso, sono arrivate quelle innovazioni tecnologiche che, poi riprese e rielaborate da altri, hanno posto le basi per l'evoluzione dei sistemi informatici e del Web. Basti pensare alle applet e all'idea di virtual machine: un runtime engine che permette di eseguire lo stesso codice su qualunque browser e su qualunque macchina.

Quelle erano le basi per le attuali RIA, idea cavalcata poi da Macromedia (Adobe) e che oggi si declina anche in chiave Microsoft e JavaScript.

Sun però non è rimasta a guardare e mette a disposizione JavaFX, un linguaggio di scripting cross-platform, adatto sia ad applicazioni stand-alone, sia alle RIA, poiché si integra al browser via Applet. In più, supportando i protocolli JNPL e MIDP, è utilizzabile anche per le soluzioni Web Start e per i dispositivi mobili.

Per iniziare possiamo scaricare l'SDK, che contiene il compilatore e le librerie fondamentali. Continuiamo poi esaminando alcune caratteristiche di JavaFX script, il linguaggio di scripting con il quale realizzeremo anche un piccolo esempio.

La sintassi di JavaFX è più snella e descrittiva rispetto a Java, simile a quella di Groovy. Il linguaggio di scripting, pienamente supportato dalla JRE, si chiama "JavaFX Script Programming Language" o semplicemente JavaFX script. Esaminiamone le caratteristiche principali.

Variabili e oggetti

In JavaFX script, possiamo definire le variabili dichiarando il tipo di dato in maniera esplicita oppure effettuando una dichiarazione generica. In ogni caso per dichiarare variabili e costanti ci serviamo rispettivamente delle parole chiave var e def.

Parola chiave Dichiarazione
var variabili
def costanti

Esaminiamo ora la definizione di una classe:

public class MyClass {
    var attr1;
    var attr2;
    var attr3   // manca il ';' ma non si è formalmente
}               // obbligati a rispettare la sintassi

Una classe si istanzia con:

MyClass {
    attr1: "a String";
    attr2: .1234;      // 0 omesso, corrisponde al
                       // valore decimale 0.1234
}

In questo caso si sta invocando il costruttore di MyClass inizializzandone gli attributi rispettivamente con una stringa e con un numero decimale. La firma del costruttore è libera, sono perciò permesse tutte le combinazioni.

Vediamo ora come definire il tipo di una variabile:

var myString:String;

o servici dell'assegnazione implicita:

var myClass = MyClass {
    attr1: "a String";
    attr2: .1234;
}

È anche utile esaminare il legame nativo al pattern observer, utile per le architetture orientate agli eventi, che avviene attraverso la keyword bind:

var myString:String = "a String";
var myClass = MyClass {
    attr1: bind myString;
    attr2: .1234;
}

la quale fa in modo che ogni modifica alla variabile myString comporti la modifica del valore di attr1, ma non il contrario.

Operare con le stringhe

Diversamente da Java non è prevista la differenza tra i tipi Char e String in quanto è utilizzato solo il tipo String. In questo contesto è possibile referenziare variabili attraverso l'operatore {}:

var myNumber:Number = 1234;
var myString:String = "my number is {myNumber}";

o col comodo meccanismo del binding, tenere aggiornati i valori:

var myString:String = bind "my number is {myNumber}";

Array e sequenze

Per le sequenze è previsto l'array, tipizzato o meno, allo stesso modo delle variabili. È possibile inizializzare la sequenza con espressioni.

L'utilizzo di parole chiave come insert, delete, into, before e after, per accedere o modificare i dati contenuti, rende più leggibile il codice e permette di svincolarsi dalla regolarità degli indici:

// crea una lista contenente interi da 1 a 5
var numbers:Integer[] = [1..5];	
// inserisce 6 in coda alla sequenza
insert 6 after numbers[100];
// inserisce 0 in testa alla sequenza,
// equivale a referenziare numbers[0]
insert 0 before numbers[-3];

Hello World con JavaFX

Di seguito illustriamo una semplice applicazione, un "Hello World" di poco modificato per mostrare i potenziali precedentemente descritti della sintassi, mostrando come output i valori di un array di numeri.

Il codice sorgente va salvato in un file con estensione .fx, da cui viene generato il .class, una volta compilato. La main-class è definita da un'istanza di javafx.stage.Stage, che rappresenta lo spazio in cui l'applicazione viene eseguita.

/*
 * Numbers.fx
 */
package it.html.fx;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
/**
 * @author Html.it
 */
var numbers:Integer[] = [1..5];
insert 6 after numbers[100];
insert 0 before numbers[-2];
Stage {
     title: "Numbers!"
     width: 250
     height: 80
     scene: Scene {
          content: [
               Text {
                    font : Font { size : 16 }
                    x: 10
                    y: 30
                    content: bind "Numbers: {numbers}"
               }
          ]
     }
}

Esaminiamo alcune delle classi che abbiamo utilizzato nel codice:

Classe Descrizione
Stage è l'oggetto principale dell'applicazione, equivalente al main
Scene questa classe è un contenitore per gli oggetti di tipo Node. All'interno dell'applicazione possiamo utilizzare più "scene"
Node è la superclasse comune a tutti gli elementi visualizzabili
Text è usato per definire un'area di testo
Font è usato per definire il font dell'oggetto Text che lo referenzia

Compilare il progetto

Nella cartella bin dell'SDK troviamo le utility necessarie per la compilazione e il deploy della nostra applicazione le più importanti sono:

  • javafxc, il compilatore
  • javafxpackager, l'utility che crea tutti i file necessari alla distribuzione dell'applicazione (anche l'HTML)

Iniziamo lanciando la compilazione del nostro progettino. Dalla riga di comando scriviamo:

javafxc it/html/fx/numbers.fx

Il compilatore produrrà una serie di file .class. Possiamo testare l'applicazione semplicemente con il comando:

javafx it.html.fx.numbers

Ora possiamo assemblare il jar creare una vera e propria distribuzione grazie al packager:

javafxpackager -src ./ -appClass it.html.fx.numbers

al quale passiamo la cartella contenente i sorgenti (i file .class) e la classe principale dell'applicazione (tutto il namespace).

Il packager produce una cartella dist, che contiene il file numbers.jar, corredato da una pagina HTML con il codice per l'ebbedding e i file per Java Web Start.

Deploy multipiattaforma

Mostreremo come il semplice codice dell'esempio può essere eseguito:

  • da riga di comando
  • come Applet
  • come applicazione Web Start
  • su un dispositivo Mobile

Da riga di comando

Si lancia come un semplice jar, nel Manifest.mf va specificata la main class:

Manifest-Version: 1.0
Implementation-Title: FxSampleNumbers
Implementation-Vendor: Html.it
Main-Class: it.html.javafx.sample.numbers 

e si procede da riga di comando:

javafx -jar FxSampleNumbers.jar

JavaFX Applet

L'integrazione nel browser può avvenire attraverso il tag <applet> oppure utilizzando un oggetto JavaScript, e va importata la libreria dtfx.js. In quest'ultimo caso, il codice è:

<script src="http://dl.javafx.com/1.2/dtfx.js"></script>
<script>
javafx({ archive: "FxSampleNumbers.jar",
         width: 200,
         height: 200,
         code: "it.html.javafx.sample.Numbers",
         name: "Numbers"
       });
</script>

quindi, in maniera molto simile a come avremmo utilizzato il tag <applet>:

<applet code="it.html.javafx.sample.Numbers"
        
        
        archive="FxSampleNumbers.jar,<aggiungere le altre librerie per javafx>"
        name="Numbers" >
</applet>

Applicazione Web Start

Anche l'uso del codice come applicazione Web Start non presenta particolari problemi. Il file JNPL (FxSampleNumbers.jnpl)si configura in questo modo:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="<percorso sul server>" href="FxSampleNumbers.jnlp">
<information>
  <title>Numbers</title>
  <vendor>Html.it</vendor>
  <homepage href="percorso sul server" />
  <description>FxSampleNumbers</description>
  <offline-allowed />
  <shortcut>
    <desktop/>
  </shortcut>
</information>
<resources>
  <j2se version="1.5+" />
  <extension name="JavaFX Runtime" href="http://dl.javafx.com/1.2/javafx-rt.jnlp" />
  <jar href="FxSampleNumbers.jar" main="true"/>
</resources>
<application-desc main-class="com.sun.javafx.runtime.main.Main">
  <argument>MainJavaFXScript=it.html.javafx.sample.Numbers</argument>
</application-desc>
<update check="background">
</jnlp>

Midlet

Per integrare il programma in un dispositivo mobile, bisogna creare il descrittore del jar, HelloWorld.jad, ad esempio:

MIDlet-Name: Numbers
MIDlet-Version: 1.0
MIDlet-Vendor: Html.it
MicroEdition-Profile: JAVAFX-1.2
MicroEdition-Configuration: CLDC-1.1
MIDlet-1: it.html.javafx.sample.Numbers_MIDlet
MIDlet-Jar-URL: FxSampleNumbers.jar
MIDlet-Jar-Size: 15153

rispetto ai precedenti esempi, in questo caso va però modificato il Manifest (Manifest.mf):

Manifest-Version: 1.0
MicroEdition-Configuration: CLDC-1.1
MIDlet-Name: Numbers
MIDlet-Vendor: Html.it
MIDlet-1: FxSampleNumbers,,it.html.javafx.sample.Numbers_MIDlet
MIDlet-Version: 1.0
MicroEdition-Profile: JAVAFX-1.2

Infine, si procede scaricando i files e installandoli. In ogni caso bisogna controllare che il dispositivo ne supporti le configurazioni (in questo caso JAVAFX-1.2 e CLDC-1.1).

Conclusioni

Questo è stato un semplice primo approccio, ma è possibile anche sfruttare le diverse librerie per realizzare, con JavaFX, animazioni, contenuti multimediali e form. Inoltre abbiamo a disposizione l'SDK integrato in NetBeans, con le impostazioni preconfezionate per i test sui dispositivi.

Ti consigliamo anche