Laboratorio di IUM Lezione 1 I Frame Di Blasi Gianpiero - D.M.I. - Università di Catania Cosa impareremo oggi? ● I Frame ● Creazione di un frame ● La gerarchia dei frame ● Visualizzazione di informazioni in un frame Introduzione (1) ● Quando Java 1.0 fu introdotto conteneva una libreria chiamata AWT (Abstract Window Toolkit) per la programmazione delle GUI – ● tale libreria gestisce gli elementi di interfaccia “delegando” il compito al SO sottostante Con il tempo ci si rese conto che tale approccio non era ottimale: – – – leggere differenze di comportamento tra i vari SO alcuni SO hanno pochissimi elementi di interfaccia presenza di bug diversi per ogni SO Introduzione (2) ● Nel 1996 Netscape ha introdotto una libreria GUI detta IFC (Internet Foundation Class) – – ● ● tale libreria “dipinge” gli elementi di interfaccia dentro una finestra vuota al SO è richiesta solo la costruzione delle finestre e la possibilità di disegnare su esse In tal modo i widget di IFC si presentano e comportano nello stesso modo su qualsiasi SO SUN ha lavorato con Netscape per perfezionare la IFC in seguito ribattezzata Swing Introduzione (3) ● Swing fa parte di un framework più grande chiamato JFC (Java Foundation Class) che comprende anche: – – – – ● Java2D l'API per il Drag'N'Drop l'API per l'accessibilità altro ancora Swing non è un completo sostituto di AWT: alcune funzionalità delle GUI vengono ancora gestite tramite AWT (eventi, layout, ecc.) Swing vs AWT ● Pro: – – – – ● più ricca di elementi, più semplice, più pratica indipendente dalla piattaforma risultato coerente su ogni piattaforma in continuo aggiornamento Contro: – – leggermente più lenta (poco visibile sui computer attuali) le applicazioni Java non risultato “in linea” con le applicazioni native (problema in parte risolvibile) I Frame (1) ● ● ● I Frame sono la “struttura” che sostiene un'applicazione Frame significa: cornice, intelaiatura, struttura, scheletro, sostegno Un Frame fornisce un rettangolo “decorato” il cui compito è contenere tutto quello che l'applicazione deve mostrare all'utente ● È un oggetto molto complesso ● Fortunatamente però è molto semplice da usare I Frame (2) ● I Frame “regalano” in automatico una serie di funzionalità base (in funzione del SO sottostante): – – – – pulsanti di riduzione a icona, massimizzazione e chiusura possibilità di riposizionamento e ridimensionamento tramite mouse barra del titolo icona dell'applicazione I Frame (3) Esempio FirstFrame Il problema della chiusura del Frame (1) ● ● ● L'esempio appena mostrato ha un comportamento che spesso non è quello desiderato: l'applicazione non si chiude alla chiusura del Frame Questo avviene perché in generale la chiusura di un Frame non implica che l'applicazione debba chiudersi (si pensi ad applicazioni multi-frame) È compito del programmatore chiedere esplicitamente a Java di chiudere l'applicazione al chiudersi del Frame Il problema della chiusura del Frame (2) ● Esistono due modi per ottenere questo risultato – il primo metodo è tramite un semplice comando che “spiega” al frame cosa deve fare quando si chiude – questa operazione viene svolta tramite il metodo: ● – void setDefaultCloseOperation(int type) il secondo metodo è più complesso, ma molto più flessibile e viene fatto tramite gli “eventi” (di questo argomento parleremo nelle prossime lezioni) Il problema della chiusura del Frame (3) Esempi CloseableFrame_a1 CloseableFrame_a2 La gerarchia dei Frame (1) ● Quali sono i metodi e le variabili già predefinite in JFrame? Quali debbo aggiungere? – – – come in tutta la programmazione ad oggetti occorre conoscere la “gerarchia” entro la quale si colloca il JFrame conoscere la gerarchia in una qualsiasi libreria e sapersi orientare in essa è essenziale per un buon sviluppatore (in qualunque linguaggio!) per conoscere la “derivazione” di ogni oggetto Java si deve fare ricorso alla documentazione La gerarchia dei Frame (2) ● ● ● ● Per quanto riguarda le Swing è molto facile trovarle nella documentazione Java Infatti si trovano tutte nel package javax.swing (javax è il prefisso di tutte le librerie che non sono “core” di Java ma sue estensioni) Inoltre i nomi delle classi Swing iniziano tutti con una J maiuscola La J è stata aggiunta per distinguere tali oggetti dalle controparti con uguale nome nelle librerie AWT La gerarchia dei Frame (3) ● Cosa vuol dire questa lunga derivazione? ● JFrame è innanzitutto un Object ● Esso è poi un java.awt.Component ● Cosa vuol dire? La classe java.awt.Component “A component is an object having a graphical representation that can be displayed on the screen and that can interact with the user. Examples of components are the buttons, checkboxes, and scrollbars of a typical graphical user interface” ● Una componente è un oggetto assai generale ● Essa definisce una lunghissima lista di metodi ● Ne vedremo qualcuno man mano che ci interesseranno La classe java.awt.Container ● ● È una Component con la proprietà di essere abilitata a contenere altre Component In quanto tale essa prevede metodi tipo: – – ● void add(Component c): aggiunge componenti void remove(Component c): rimuove componenti Essa prevede inoltre parecchi altri metodi La classe java.awt.Window ● ● È un particolare contenitore che può apparire sullo schermo come entità propria, ma non ha ne bordi, ne barre, ne controlli Possiede metodi tipo: – – – – void setVisible(boolean b): mostra/nasconde la finestra (in realtà è ereditato da Component) void setLocation(int x, int y): posiziona la finestra void setSize(int w, int h): dimensiona la finestra void toFront(), void toBack(): aggiusta l'ordine di comparizione relativamente ad altre finestre La classe java.awt.Frame ● ● Si tratta di Window cui sono state aggiunte bordi e barra del titolo, oltre alle capacità minime di interfaccia (minimizzazione, riduzione ad icona, chiusura, possibilità di resizing o meno, ecc.) Possiede metodi tipo: – – – void setTitle(String str): imposta un titolo void setResizable(boolean b): imposta la “ridimensionabilità” di una finestra void setIconImage(Icon icon): imposta l'icona della barra del titolo La classe javax.swing.JFrame (1) ● ● ● Si tratta dell'effettivo Frame che utilizzeremo in tutte le applicazioni a finestra Esso è un Frame delle AWT a cui le Swing aggiungono una serie di metodi e servizi importanti Inoltre moltissimi dei metodi definiti nel Frame sono stati ridefiniti per correggere il malfunzionamento delle AWT La classe javax.swing.JFrame (2) ● ● ● Come primo esempio vediamo come centrare un frame sullo schermo Primo problema: come si recuperano le dimensioni dello schermo? Le applicazioni interagiscono con il SO ed il device di esecuzione con una classe che costituisce la “cassetta degli attrezzi” di Java: la classe java.awt.Toolkit La classe javax.swing.JFrame (3) Esempi CenteredFrame_a1 CenteredFrame_a2 La classe javax.swing.JFrame (4) ● Secondo esempio: ridurre a icona e massimizzare ● Per fare ciò i Frame hanno il metodo: – ● Esiste un altro metodo: – ● void setExtendedState(int state): riduce a icona, massimizza e visualizza in modalità normale void setState(int state): analogo, ma non massimizza La presenza di due metodi ha motivi “storici”: – le prime versioni di Java non potevano massimizzare (le prime GUI Unix non avevano tale funzionalità) La classe javax.swing.JFrame (5) Esempio StateFrame La struttura di un JFrame (1) ● Un JFrame contiene una serie di pannelli secondo una precisa relazione: – – – – JRootPane: serve a contenere il “glassPane” e il “layeredPane” glassPane: è un pannello invisibile che “copre” tutti gli elementi del Frame e può catturare per primo tutti le azioni che il mouse fa sulla finestra layeredPane serve a contenere il contentPane e (l'eventuale) menù che si aggiunge al Frame Il contentPane serve a contenere tutti gli altri elementi GUI del Frame La struttura di un JFrame (2) Arricchire un Frame ● ● ● ● ● Non possiamo disegnare, scrivere o aggiungere elementi direttamente al Frame Gli elementi diversi dal menu devono essere “aggiunti” al contentPane Primo obiettivo: scrivere un testo dentro il Frame Il testo verrà scritto su un “componente” che verrà “aggiunto” o “attaccato” al contentPane Tale componente è un JPanel javax.swing.JPanel ● È una delle più semplici componenti Swing ● Serve come area rettangolare sulla quale: – – inserire altri pannelli e componenti Swing disegnare La classe javax.swing.JComponent (1) “The base class for all Swing components except top-level containers. To use a component that inherits from JComponent, you must place the component in a containment hierarchy whose root is a top-level Swing container. Top-level Swing containers (such as JFrame, JDialog and JApplet) are specialized components that provide a place for other Swing components to paint themselves.” La classe javax.swing.JComponent (2) ● ● Tale classe introduce moltissime funzionalità legate alle Swing Una delle funzionalità più importanti (ed anche quella che serve a noi in questo momento) introdotte da questo tipo di oggetto è la possibilità di essere “disegnato” con il metodo: – void paintComponent(Graphics g): disegna dentro un JComponent La classe javax.swing.JComponent (3) Esempio HelloWorld2D Esercizi (1) ● ● ● ● Scrivere un'applicazione che crei un frame delle dimensioni specificate con JOptionPane Scrivere un'applicazione che faccia “camminare” un frame per lo schermo Scrivere un'applicazione che scriva all'interno di un frame una frase specificata con JOptionPane Scrivere un'applicazione che crei un frame con i parametri posizione, dimensione e titolo specificati con JOptionPane Esercizi (2) ● Scrivere un'applicazione con le seguenti specifiche: – – ● creazione e visualizzazione di 16 frame uguali che senza sovrapporsi riempiono lo schermo il titolo dei frame indica quale è la loro posizione nell'array di frame così creato Proporre e implementare una soluzione al problema: come si fa a “spegnere” l'applicazione solo alla chiusura di tutti i frame?