01-Java Swing - Creare Finestre Top Level

download 01-Java Swing - Creare Finestre Top Level

of 20

Transcript of 01-Java Swing - Creare Finestre Top Level

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    1/20

    Bocchi Cinzia 10/01/2015 1

    Elementi dellinterfaccia utente Swing: Finestre Top Level

    Premessa

    Una finestra top level ( di massimo livello ) una finestra dotata di barra del titolo e bordi enon contenuta in altre finestre. Ogni applicazione ha bisogno di una finestra di questotipo che funga da contenitore per tutti gli altri componenti dellinterfaccia utente .

    La dispensa mostra alcuni metodi alternativi per creare una finestra top level mediantescrittura diretta del codice e utilizzando il tool visuale Window Builder (integrato in EclipseLUNA). In particolare si vedr come creare una finestra con titolo, icona personalizzata ecentrata nello schermo del computer.

    Indice

    Gerarchia di classi coinvolte Costruttori della classe JFrame

    Propriet basilari di una finestra top level

    Creazione di una finestra top level nel main

    Creazione di una classe che definisce una finestra top level

    Una variante: il metodo initialize

    Posizionamento di una finestra e icona personalizzata: la classe Toolkit

    Altre propriet di una finestra top level Il problema dei metodi non thread safe

    Creazione di una finestra top level con Window Builder

    Videolezioni

    Java Swing Creare finestre top level Parte 1

    Java Swing Creare finestre top level Parte 2

    Java Swing Creare finestre top level Parte 3

    Java Swing Creare finestre top level Parte 4

    http://localhost/var/www/apps/conversion/tmp/scratch_6/Creare%20un%20framehttp://youtu.be/A8KOHesIVzYhttp://youtu.be/A8KOHesIVzYhttp://youtu.be/A8KOHesIVzYhttp://youtu.be/A8KOHesIVzYhttp://youtu.be/A8KOHesIVzYhttp://youtu.be/6NhH7BtPGP8http://youtu.be/6NhH7BtPGP8http://youtu.be/6NhH7BtPGP8http://youtu.be/6NhH7BtPGP8http://youtu.be/6NhH7BtPGP8http://youtu.be/7uEQVXQXfYIhttp://youtu.be/7uEQVXQXfYIhttp://youtu.be/7uEQVXQXfYIhttp://youtu.be/7uEQVXQXfYIhttp://youtu.be/7uEQVXQXfYIhttp://youtu.be/UPNlDW9Nh0ghttp://youtu.be/UPNlDW9Nh0ghttp://youtu.be/UPNlDW9Nh0ghttp://youtu.be/UPNlDW9Nh0ghttp://youtu.be/UPNlDW9Nh0ghttp://youtu.be/UPNlDW9Nh0ghttp://youtu.be/7uEQVXQXfYIhttp://youtu.be/6NhH7BtPGP8http://youtu.be/A8KOHesIVzYhttp://localhost/var/www/apps/conversion/tmp/scratch_6/Creare%20un%20frame
  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    2/20

    Bocchi Cinzia 10/01/2015 2

    Gerarchia di classi coinvolte

    Figura 1 Classi utilizzate per creare una finestra top level

    La figura 1 mostra le principali classi coinvolte nella creazione di una finestra top level.Una finestra top level viene creata come istanza della classe JFrame. Vediamo, allora,alcuni costruttori di tale classe.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    3/20

    Bocchi Cinzia 10/01/2015 3

    Alcuni costruttori della classe JFrame

    public JFrame ()Crea una finestra senza titolo e non visibile.

    public JFrame (String title)Crea una finestra non visibile, con il titolo specificato.

    La finestra creata ha le seguenti caratteristiche: ridimensionabile mediante il pulsante presente sulla barra del titolo; riducibile a icona mediante il pulsante presente sulla barra del titolo; dimensionabile con il mouse, agendo sul contorno.

    Propriet basilari di una finestra top levelPrima di creare una finestra top level occorre stabilire i valori delle seguenti propriet:

    1. il t i to lo che apparir nella barra del titolo;2. la d imens ione , cio la sua larghezza (width) e la sua altezza (height) in pixel;3. la posiz ione a partire dalla quale sar visualizzata, cio lascissa e lordinata del

    vertice superiore sinistro;4. loperazione associata al pulsante di chiusura.

    I metodi coinvolti nella impostazione di tali propriet sono riassunti nella seguente tabella.

    Classe Metodo

    java.awt.Frame public void setTitle (String title)Imposta il titolo del frame alla stringa passata come parametro. Il titolopu essere impostato anche in fase di creazione dellistanza con ilcostruttore JFrame(String title) .

    java.awt.Window public void setSize (int width, int height)Imposta la larghezza ( width ) e laltezza (height ) della finestra;

    larghezza e altezza sono espressi in pixel.

    java.awt.Window public void setLocation (int x, int y)Posiziona la finestra a partire dal punto di coordinate (x, y). Il verticesuperiore sinistro della finestra coincide con il punto di coordinatespecificate. Se non indicato , la finestra viene posizionata nelloriginedegli assi (vertice superiore sinistro dello schermo).

    java.awt.Window public void setBounds (int x, int y, int width, intheight)Combina i metodi setLocation e setSize , consentendo di impostare

    la posizione iniziale e la dimensione della finestra con un'unicaoperazione.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    4/20

    Bocchi Cinzia 10/01/2015 4

    javax.swing.JFrame public void setDefaultCloseOperation (int operation)Specifica l'operazione da eseguire quando si fa clic sul pulsante dichiusura della finestra (il pulsante con la X). Il parametro operation pu assumere uno dei seguenti valori: EXIT_ON_CLOSE - costante di JFrame ; chiude la finestra e

    termina lapplicazione. DISPOSE_ON_CLOSE - costante dell'interfacciaWindowConstants ; chiude la finestra, liberando le risorse disistema, ma senza interrompere l'esecuzione.

    DO_NOTHING_ON_CLOSE - costante di WindowConstants ; nonesegue alcuna azione.

    HIDE_ON_CLOSE - costante di WindowConstants ; nasconde lafinestra ( il valore di default).

    Creazione di una finestra top level nel main

    010203040506070809

    101112131415161718192021222324252627282930

    import javax.swing.JFrame;

    public class MyFrame {

    public static void main(String[] args ) {

    final int WIDTH = 450;final int HEIGHT = 300;final int X = 100;

    final int Y = 100;

    //Creare l'istanza della classe JFrame JFrame frame = new JFrame( "MyFrame" );

    //Impostare la dimensione del frame frame .setSize( WIDTH, HEIGHT);

    //Impostare la posizione del frame frame .setLocation( X, Y);

    //Impostare l'operazione associata al pulsante di chiusuradel frame

    frame .setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );

    //Rendere il frame visibile frame .setVisible( true );

    }

    } MyFrame versione 1

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    5/20

    Bocchi Cinzia 10/01/2015 5

    righi 07-10Costanti simboliche che contengono rispettivamente i valori interi della larghezza edellaltezza della finestra, dellascissa e dellordinata del suo vertice superiore sinistro.

    rigo 13

    Crea una finestra top level come istanza della classe JFrame e le assegna il titoloMyFrame.

    rigo 16Imposta la larghezza della finestra a WIDTH pixel e laltezza a HEIGHT pixel.

    rigo 19Posiziona il vertice superiore sinistro della finestra nel punto di coordinate ( X, Y).

    rigo 23 Associa al pulsante di chiusura della finestra loperazione che termina lapplicazione.

    rigo 26Visualizza la finestra.

    Creazione di una classe che definisce una finestra top level

    Possiamo creare una classe MyFrame che estende la classe JFrame . Le propriet dellafinestra devono essere impostate nel costruttore di MyFrame e, nella classe, deve esseredefinito un metodo main per creare la finestra e renderla visibile.

    010203040506070809

    1011121314151617181920

    212223

    import javax.swing.JFrame;

    @SuppressWarnings ( "serial" )public class MyFrame extends JFrame {

    public static final int WIDTH = 450;public static final int HEIGHT = 300;public static final int X = 100;public static final int Y = 100;

    public MyFrame() {

    //Impostare il titolo della finestra setTitle( "MyFrame" );

    /*In alternativa * super("MyFrame"); */

    //Impostare la dimensione della finestra

    setSize( WIDTH , HEIGHT );

    //Impostare la posizione iniziale

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    6/20

    Bocchi Cinzia 10/01/2015 6

    2425262728

    293031323334353637383940

    setLocation( X , Y );

    /*In alternativa a setSize + setLocation * setBounds(X, Y, WIDTH, HEIGHT); */

    //Impostare l'operazione associata al pulsante di chiusura setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );

    }

    public static void main(String[] args ) {MyFrame frame = new MyFrame();frame .setVisible( true );

    }

    } MyFrame versione 2

    rigo 03Sopprime il warning riferito alla mancata serializzazione. La serializzazione utilizzata pergli oggetti persistenti o in altre situazioni che, al momento, non ci interessano.

    righi 06-09Le costanti di classe WIDTH, HEIGHT, X e Y rappresentano rispettivamente la larghezza elaltezza del frame e le coordinate del suo vertice superiore sinistro.

    righi 13-18Il costruttore della classe MyFrame esegue una chiamata al metodo setTitle perimpostare il titolo della finestra. In alternativa, possibile chiamare il costruttore dellasuperclasse JFrame, specificando come parametro il titolo del frame, utilizzando:super("MyFrame") .

    rigo 21Il metodo setSize imposta la dimensione del frame.

    rigo 24Il metodo setLocation imposta la posizione iniziale del frame; la posizione, se nonspecificata, coincide con il punto origine degli assi.

    rigo 27 Al posto dei metodi setSize e setLocation si pu usare il metodo setBounds : essoeffettua le due operazioni contemporaneamente.

    rigo 31La chiamata al metodo setDefaultCloseOperation imposta loperazione associata alpulsante di chiusura del frame.

    righi 35-37

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    7/20

    Bocchi Cinzia 10/01/2015 7

    Tra i metodi della classe presente il metodo main : in tal modo possibile testare ilfunzionamento della classe, senza dover scrivere una specifica applicazione. Qualora siscriva invece, un'applicazione che utilizza la classe MyFrame , il metodo main presentenell'applicazione, prevarr su quello definito nella classe stessa.

    Una volta creata la finestra, questa non ancora visibile. Per visualizzarla occorrechiamare il metodo setVisible , passandogli come parametro true . La visualizzazione diuna finestra deve avvenire dopo che tutte le impostazioni iniziali sono state applicate.

    Una variante: il metodo initialize

    In alcuni esempi il codice che si occupa dellinizializzazione della finestra viene racchiusoin un metodo privato, invece che nel costruttore della classe. Il costruttore si limita,pertanto, ad invocare tale metodo. Vediamo le modifiche apportate al precedente codice.

    0102030405060708091011121314151617181920

    2122232425262728293031323334

    import javax.swing.JFrame;

    @SuppressWarnings ( "serial" )public class MyFrame extends JFrame {

    public static final int WIDTH = 450;public static final int HEIGHT = 300;public static final int X = 100;public static final int Y = 100;

    public MyFrame() {

    initialize();

    }

    private void initialize() {//Impostare il titolo della finestra setTitle( "MyFrame" );

    //Impostare la dimensione della finestra setSize( WIDTH , HEIGHT );

    //Impostare la posizione iniziale setLocation( X , Y );

    //Impostare l'operazione associata al pulsante di chiusura setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );

    }

    public static void main(String[] args ) {MyFrame frame = new MyFrame();frame .setVisible( true );

    }

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    8/20

    Bocchi Cinzia 10/01/2015 8

    3536 }

    MyFrame versione 3

    Posizionamento di una finestra e icona personalizzata: la classe ToolkitLa classe astratta Toolkit fornisce una interfaccia verso la piattaforma in uso, consentendodi ottenere informazioni su, ad esempio, la dimensione di una finestra, i font disponibili, ecos via. Toolkit consente, pertanto, di risolvere i problemi di visualizzazione dovuti allecaratteristiche specifiche della piattaforma. Ogni piattaforma che supporta Java devefornire una classe concreta che estende la classe Toolkit.Nonostante Java sia indipendente dalla piattaforma, pu capitare che a parit di bytecode,di sistema operativo e di JDK, linterfaccia utente appaia diversa. Questo problema dovuto alla risoluzione dello schermo che pu variare a seconda della scheda video in usoe in base alle preferenze dellutente. Per esempio, un frame di dimensioni 800x600potrebbe essere troppo grande per uno schermo con risoluzione 640x480 e troppo piccoloper uno schermo con risoluzione 1024x768.La maggior parte dei metodi della classe Toolkit sono chiamati dal sistema, ma esistonoalcuni metodi che risultano particolarmente utili e che andiamo ad analizzare di seguito.

    Alcuni metodi della classe java.awt.Toolkit

    public static Toolkit getDefaultToolkit ()

    Restituisce il toolkit predefinito.

    public abstract Image getImage (String filename)Carica un immagine dal file specificato. I formati immagine consentiti sono GIF, JPG e PNG.

    public abstract Image getImage (URL url)Carica una immagine dallurl specificato. I formati immagine consentiti sono GIF, JPG e PNG.

    public abstract Dimension getScreenSize ()Restituisce le dimensioni dello schermo dellutente.

    Vediamo ora, nel dettaglio, le operazioni necessarie per posizionare la finestracentralmente nello schermo e per associare ad essa unicona personalizzata.

    Posizionare centralmente la finestra nello schermo

    Toolkit kit = Toolkit. getDefaultToolkit ();

    Il metodo statico getDefaultToolkit restituisce nella variabile kit il riferimento al toolkitdi default.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    9/20

    Bocchi Cinzia 10/01/2015 9

    Dimension screenSize = kit .getScreenSize();

    Il metodo getScreenSize restituisce un oggetto Dimension contenente le dimensionidello schermo.

    int screenWidth = screenSize . width ;int screenHeight = screenSize . height ;

    Un oggetto Dimension ha due variabili di istanza pubbliche intere width e height checontengono rispettivamente la larghezza e laltezza dellelemento considerato. Diconseguenza, basta accedere ad esse in lettura per ottenere la larghezza e laltezza delloschermo. Dopo le assegnazioni, screenWidth contiene la larghezza dello schermo escreenHeight la sua altezza.

    int x = ( screenWidth - WIDTH ) / 2;

    int y = ( screenHeight - HEIGHT ) / 2;setLocation( x, y);

    Ora che conosciamo altezza e larghezza dello schermo, eseguiamo un semplice calcoloper ottenere le coordinate del vertice superiore sinistro del frame e impostare la suaposizione iniziale con setLocation .

    Personalizzare licona della finestra

    Per prima cosa occorre salvare limmagine, per esempio icon.gif , dentro al package delprogetto Eclipse. Successivamente sufficiente eseguire il codice seguente.

    Image img = kit .getImage(getClass().getResource( "icon.gif" ));

    consente di reperire una risorsa collocata allinterno dello stesso package di MyFrame. Neldettaglio:

    getClass restituisce il tipo runtime delloggetto : class nome_package .MyFrame , getResource restituisce lurl della risorsa che ha il nome specificato , cio di icon.gif .

    La combinazione dei due metodi consente di ottenere il seguente URI:file:/ unit :/ nome_workspace / nome_progetto /bin/ nome_package /icon.gif

    che corrisponde alla effettiva collocazione della risorsa.

    getImage crea loggetto Image a partire dal file immagine.

    setIconImage( img );

    Il metodo setIconImage , infine, imposta limmagine come icona della finestra.

    Vediamo il codice completo.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    10/20

    Bocchi Cinzia 10/01/2015 10

    0102030405

    060708091011121314151617181920212223242526

    272829303132333435363738394041424344454647

    48

    import java.awt.Dimension;import java.awt.Image;import java.awt.Toolkit;import javax.swing.JFrame;

    @SuppressWarnings ( "serial" )public class MyFrame extends JFrame {

    public static final int WIDTH = 450;public static final int HEIGHT = 300;

    public MyFrame() {

    initialize();

    }

    private void initialize() {//Impostare il titolo della finestra

    setTitle( "MyFrame" );

    //Impostare la dimensione della finestra setSize( WIDTH , HEIGHT );

    //Impostare la posizione iniziale centrata nello schermo Toolkit kit = Toolkit. getDefaultToolkit ();

    Dimension screenSize = kit .getScreenSize();int screenWidth = screenSize . width ;int screenHeight = screenSize . height ;int x = ( screenWidth - WIDTH ) / 2;int y = ( screenHeight - HEIGHT ) / 2;setLocation( x, y);

    //Aggiungere un'icona personalizzata alla finestra Image img =

    kit .getImage(getClass().getResource( "duke_icon.jpg" ));setIconImage( img );

    //Impostare l'operazione associata al pulsante di chiusura setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );

    }

    public static void main(String[] args ) {MyFrame frame = new MyFrame();frame .setVisible( true );

    }

    } MyFrame versione 4

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    11/20

    Bocchi Cinzia 10/01/2015 11

    La figura seguente mostra la finestra generata dal precedente codice.

    Figura 2 La finestra top level generata con il codice MyFrame versione 4

    Altre propriet di una finestra top level

    Nel seguito sono riportati alcuni metodi utili per impostare ulteriori propriet di una finestratop level.

    Classe Metodo

    java.awt.Component public int getHeight ()Restituisce l'altezza del componente.

    java.awt.Component public int getWidth ()Restituisce la larghezza del componente.

    java.awt.Component public int getX ()Restituisce l'ascissa del vertice superiore sinistro del componente.

    java.awt.Component public int getY ()Restituisce lordinata del vertice superiore sinistro del componente.

    java.awt.Component public boolean isEnabled ()Restituisce true se il componente abilitato; false altrimenti. Uncomponente abilitato pu rispondere allinput dellutente e generaeventi. I componenti vengono creati abilitati, per default.

    java.awt.Component public boolean isVisible ()Restituisce true se il componente visibile quando lo il componente

    genitore (quello che lo contiene); false altrimenti.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    12/20

    Bocchi Cinzia 10/01/2015 12

    java.awt.Component public void setEnabled (boolean b)Se b uguale true , abilita il componente, altrimenti lo disabilita.

    java.awt.Component public String toString ()Restituisce una rappresentazione del componente sotto forma di

    stringa.

    java.awt.Window public void dispose ()Chiude la finestra e libera tutte le risorse di sistema da essa occupate.

    java.awt.Window public Color getBackground ()Restituisce il colore di sfondo della finestra.

    java.awt.Window public boolean isAlwaysOnTop ()Restituisce true se la finestra sempre in primo piano, false altrimenti. Nel caso ci siano pi finestre always on top, il loro ordine

    dipende dalla piattaforma in uso.

    java.awt.Window public boolean isAutoRequestFocus ()Restituisce true se la finestra riceve automaticamente il focus quandoviene resa visibile o quando viene portata in primo piano, false altrimenti. Il valore di default di questa propriet true .

    java.awt.Window public void pack ()Visualizza la finestra determinandone automaticamente la dimensionesulla base della dimensione dei suoi componenti.

    java.awt.Window public void setAlwaysOnTop (boolean b)Se b uguale true , imposta la finestra come finestra always on top,cio sempre in primo piano. Si veda il metodo isAlwaysOnTop .

    java.awt.Window public void setVisible (boolean b)Se b uguale true , rende visibile la finestra, mentre la nasconde se b uguale a false .

    java.awt.Window public void setAutoRequestFocus (boolean b)Se b uguale true , la finestra riceve automaticamente il focus ognivolta che viene resa visibile o che viene portata in primo piano. Si vedail metodo isAutoRequestFocus .

    java.awt.Frame public String getTitle ()Restituisce il titolo del frame.

    java.awt.Frame public boolean isResizable ()Restituisce true se il grame pu essere ridimensionato dallutente,false altrimenti.

    java.awt.Frame public void setBackground (Color bgColor)Imposta il colore di sfondo del frame al colore specificato.

    java.awt.Frame public void setResizable (boolean b)Se b uguale true , rende il frame ridimensionabile dallutente.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    13/20

    Bocchi Cinzia 10/01/2015 13

    java.awt.JFrame public Container getContentPane ()Le finestre create con JFrame contengono al loro interno un certonumero di pannelli predefiniti, uno dei quali il pannello del contenuto(contentPane ). Qualsiasi componente pu essere aggiunto

    direttamente solo a questo pannello predefinito. Il metodogetContentPane restituisce il riferimento (indirizzo) a tale pannello.

    java.awt.JFrame public int getDefaultCloseOperation ()Restituisce un intero che specifica loperazione associata al pulsante dichiusura del frame. Conosciamo gi le costanti intere simboliche checonsentono di indicare tale operazione, ma pu essere utile saperequal il loro effettivo valore: EXIT_ON_CLOSE ha valore 3 DISPOSE_ON_CLOSE ha valore 2 DO_NOTHING_ON_CLOSE ha valore 0 HIDE_ON_CLOSE ha valore 1

    Si veda il seguente link alla documentazione Java.

    java.awt.JFrame public void setIconImage (Image image)Imposta limmagine specificata come icona del frame.

    Il problema dei metodi non thread safe

    Un programmatore Java pu organizzare un singolo programma suddividendo il codice inoperazioni che possono essere svolte in parallelo. In realt se il sistema

    monoprocessore, il parallelismo solo virtuale, ma lutente non nota la differenza. Talioperazioni vengono dette thread e i programmi che sono in grado di eseguire pi di unthread alla volta sono detti multithread . I thread multipli non devono essere confusi con iprocessi multipli, che sono gestiti dal sistema operativo e che dispongono di unarea dimemoria privata, separata da tutti gli altri. I thread sono gestiti dal programmatore econdividono gli stessi dati.I thread sono utilizzati per rendere i programmi pi efficienti e veloci nella risposta. Nellospecifico, quando si realizzano applicazioni con interfaccia utente grafica e il programmadeve svolgere unoperazione che richiede tempo, meglio attivare un thread dedicato asvolgere quel lavoro. Diversamente, lutente non potr interagire con linterfaccia graficafino a quando loperazione non sar terminata. Purtroppo, per, Swing non sicuro quando si tratta di gestire dei thread : la maggiorparte dei metodi di Swing non sincronizzata e questo pu causare il danneggiamentodellinterfaccia. Di conseguenza, necessario attenersi ad alcune regole presenti nellespecifiche Java. Prima di esaminare tali regole, vediamo quali tipologie di thread sonopresenti in un programma Swing.

    Tipologie di thread in un programma Swing

    Thread principale (initial thread): esegue il codice presente nel metodo main.In un programma Swing il metodo main si limita solitamente a chiamare il costruttore checrea la finestra principale, disponendone allinterno i suoi componenti, e poi chiama il

    http://docs.oracle.com/javase/8/docs/api/constant-values.html#javax.swing.WindowConstants.DISPOSE_ON_CLOSEhttp://docs.oracle.com/javase/8/docs/api/constant-values.html#javax.swing.WindowConstants.DISPOSE_ON_CLOSE
  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    14/20

    Bocchi Cinzia 10/01/2015 14

    metodo setVisible o pack per visualizzarla. Di solito, il metodo main, a questo punto,termina e il thread principale cede il controllo.

    Thread di comunicazione dellevento (event dispatch thread, EDT ): esegue il codiceche gestisce gli eventi.

    Questo thread viene creato appena appare la prima finestra. Gli eventi consistonoprevalentemente in eventi di aggiornamento che causano il ridisegno dei componentidellinterfaccia utente o eventi di input generati mediante tastiera o mouse. La maggiorparte dei metodi Swing devono essere eseguiti dallEDT perch alcuni metodi, detti nonthread safe , se eseguiti in altri thread possono danneggiare linterfaccia utente .

    Altri metodi Swing, invece, sono thread safe e possono essere eseguiti in qualsiasi thread:- i metodi repaint, revalidate, invalidate di JComponent;- tutti i metodi del tipo addXXXListener e removeXXXListener;- tutti i metodi esplicitamente documentati come thread safe.

    Di conseguenza, nella maggior parte dei casi, quando si vuole aggiornare lo stato visivodei componenti dellinterfaccia utente consigliabile utilizzare EDT.

    Thread di lavoro (worker thread o background thread): eseguono in backgroundelaborazioni considerate costose in termini di tempo e sono definiti dal programmatore.

    Se unoperazione richiede molto tempo per essere completata, eseguirla nellEDT bloccala GUI per tutta la durata delloperazion e stessa e lutente non pu interagire con essa.Per tale motivo questo tipo di elaborazioni vengono realizzate fuori dallEDT su un workerthread.

    Regole da seguire in unapplicazione Swing 1) Se unazione richiede molto tempo occorre attivare un nuovo thread per eseguirla, cosda non bloccare lEDT, impedendo allinterfaccia di rispondere agli eventi dellutente.

    Analogamente, occorre creare un nuovo thread se unoperazione pu bloccarsi su uninput o un output.2) Se necessario attendere per un cert o tempo meglio non bloccare lEDT mautilizzare un timer.3ue Questultima regola chiamata anche regola del singolo thread .

    La regola del singolo thread non vale per i metodi che utilizzano i thread in modo sicuro.Inoltre, si tenga presente che uninterfaccia pu sempre essere modificata dallEDT fino aquando nessuno dei componenti stato realizzato, cio fino a quando non viene chiamatoil metodo setVisible o pack.La regola del singolo thread molto restrittiva, ma possibile aggirarla, grazie a duemetodi della classe EventQueue.

    Regola del singolo thread e la classe EventQueue

    La classe java.awt.EventQueue definisce due metodi statici, invokeLater einvokeAndWait , che possono aggiungere operazioni alla coda di eventi per far s chevengano eseguite nellEDT. Questi metodi sono presenti anche nella classe

    javax.swing.SwingUtilities.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    15/20

    Bocchi Cinzia 10/01/2015 15

    Il codice necessario per richiamarli il seguente:

    EventQueue. invokeLater ( new Runnable() {public void run() {

    //codice che aggiorna linterfaccia }

    });

    EventQueue. invokeAndWait ( new Runnable() {public void run() {

    try {//codice che aggiorna linterfaccia

    } catch (Exception e ) {e .printStackTrace();

    }}

    });

    public static void invokeLater (Runnable runnable)Esegue il metodo run nel thread di comunicazione degli eventi (EDT), dopo che gli eventi in attesasono stati elaborati. R estituisce il controllo non appena levento viene inserito nella coda di eventi .

    public static void invokeAndWait (Runnable runnable)

    Esegue il metodo run nel thread di comunicazione degli eventi (EDT), dopo che gli eventi in attesasono stati elaborati. Si blocca fino a quando il metodo run non terminato. Pu generare delleeccezioni controllate e, pertanto, il codice deve essere racchiuso in un blocco try catch.

    Possiamo migliorare il codice della classe MyFrame inserendo il codice del metodo maindentro al metodo run, come mostrato nel seguente esempio.

    0102030405060708091011121314

    151617

    import java.awt.EventQueue;

    import javax.swing.JFrame;

    @SuppressWarnings ( "serial" )public class MyFrame extends JFrame {

    public static final int WIDTH = 450;public static final int HEIGHT = 300;public static final int X = 100;public static final int Y = 100;

    public MyFrame() {

    initialize();

    }

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    16/20

    Bocchi Cinzia 10/01/2015 16

    1819202122

    2324252627282930313233343536373839404142

    private void initialize() {//Impostare il titolo della finestra setTitle( "MyFrame" );

    //Impostare la dimensione della finestra setSize( WIDTH , HEIGHT );

    //Impostare la posizione iniziale setLocation( X , Y );

    //Impostare l'operazione associata al pulsante di chiusura setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );

    }

    public static void main(String[] args ) {EventQueue. invokeLater ( new Runnable() {

    public void run() {MyFrame frame = new MyFrame();frame .setVisible( true );

    }});

    }

    } MyFrame versione 5

    Creazione di una finestra top level con Window Builder

    WindowBuilder uno strumento integrato in Eclipse Luna per la creazione visuale diinterfacce utente. Per creare una finestra top level allinterno di un progetto occorreNew/Other dal menu File . Nella finestra che appare scegliere Appl i ca tion Window ,come mostrato in figura 3. Successivamente, specifica re il nome dellapplicazione, comemostrato in figura 4 e fare clic su Finish .

    Il tool genera automaticamente il codice dellapplicazione. Vedremo che il codice generato molto simile a quello descritto negli esempi precedenti.

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    17/20

    Bocchi Cinzia 10/01/2015 17

    Figura 3 Creazione di unapplication window

    Figura 4 Nome dellapplicazione

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    18/20

    Bocchi Cinzia 10/01/2015 18

    Di seguito il codice prodotto da Window Builder.

    01020304050607080910111213

    14151617181920212223242526272829303132333435363738394041

    mport java.awt.EventQueue;

    import javax.swing.JFrame;

    public class MyFrame {

    private JFrame frame ;

    /** * Launch the application. */

    public static void main(String[] args ) {EventQueue. invokeLater ( new Runnable() {

    public void run() {try {MyFrame window = new MyFrame();window . frame .setVisible( true );

    } catch (Exception e ) {e .printStackTrace();

    }}

    });}

    /** * Create the application. */

    public MyFrame() {initialize();

    }

    /** * Initialize the contents of the frame. */

    private void initialize() {frame = new JFrame();frame .setBounds(100, 100, 450, 300);frame .setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );

    }

    } MyFrame versione Window Builder

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    19/20

    Bocchi Cinzia 10/01/2015 19

    A questo punto possiamo intervenire direttamente sul codice per modificare alcunepropriet del frame e per aggiungere componenti, oppure possiamo utilizzare la schedaDesign per effettuare tutte queste operazione in modo visuale.

    Figura 5 La scheda Design di Window Builder

    Selezionando il frame con un clic del mouse, sono rese visibili le propriet dellelemento,nellarea Properties .

    Figura 6 Propriet della finestra

    Operazione associata alla chiusura del frame

    Il titolo della finestra

    Licona associata al frame

  • 8/10/2019 01-Java Swing - Creare Finestre Top Level

    20/20

    Facendo clic sul pulsante racchiuso nellovale rosso della figura 6, si possono vis ualizzarele propriet avanzate, mentre cliccando su quello racchiuso nellovale blu si ripristinano leimpostazioni di default.Proviamo a inserire il titolo della finestra e ad aggiungere unicona (che deve esserepreventivamente caricata nel progetto).Le modifiche si riflettono nel codice, in particolare nel metodo initialize , che diventa:

    /** * Initialize the contents of the frame. */

    private void initialize() {frame = new JFrame();frame .setIconImage(Toolkit. getDefaultToolkit ().getImage(MyFrame. cla

    ss .getResource( "/frame4/duke_icon.jpg" )));frame .setTitle( "MyFrame" );frame .setBounds(100, 100, 450, 300);frame .setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );}

    }

    Oltre a modificare le propriet del frame possiamo aggiungere diverse componenti alpannello del contenuto - getContentPane() - come pulsanti, caselle di testo e cos via.Basta selezionarli dalla Palette e poi fare clic dove si vuole inserirli, allinterno del frame. Icomponenti saranno posizionati secondo il layout impostato. Tutti questi argomentisaranno trattati nelle successive dispense.

    Quest'opera distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0Internazionale

    http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/http://creativecommons.org/licenses/by-sa/4.0/