Introduzione al package grafico Swing

Documenti analoghi
Java Applet. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

L interfaccia grafica in Java

INTERFACCE GRAFICHE IN JAVA CON SWING DISPENSE

Interazioni col mondo: eventi

Programmazione Java: Interfacce grafiche (GUI)

APPLICAZIONI & APPLET

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame("Finestra"); // crea frame invisibile

Le basi della grafica in Java. Prof. Francesco Accarino IIS Altiero Spinelli via Leopardi 132 Sesto san Giovanni

TECNOLOGIE APPLICAZIONI WEB Linguaggio Java: Le Applet

Gestione degli eventi in Java

Alessandro De Luca. Lezione, 13 maggio 2015

Classi astratte. Master in Web Technology e Security luglio - settembre Interfacce

Eventi di azione. // con interfaccia per eventi di azione

Corso sul linguaggio Java

Grafico della parabola

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

Sviluppo di Interfacce Grafiche in Java

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Interfacce grafiche. Una GUI (Graphic User Interface) contiene vari componenti: bottoni, etichette, immagini...

Corso Eclipse. Prerequisiti. 3 Window Builder

L interfaccia grafica con Java

Programmazione Orientata agli Oggetti in Linguaggio Java

! Programmazione strutturata. ! OO: TDA, scambio messaggi, eredità, polimorfismo, OO in Java. ! Rassegna API. ! Documentazione Javadoc delle API

Registratori di Cassa

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

Java: Compilatore e Interprete

CdL in Medicina Veterinaria - STPA AA

Swing. Swing 1. Java e la grafica Java permette di realizzare agevolmente applicazioni grafiche Package java.awt

BorderLayout. 1 Gestori di Layout (guida visuale)

Tutorial SWING-AWT: Il Layout Manager GridBagLayout Di Michele de Nittis

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

FLUSSO OPERATIVO Come creare un nuovo DPS (versione 2.0)

Java Interfaccia Grafica

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

Introduzione a Classi e Oggetti

7.4 Estrazione di materiale dal web

Java Virtual Machine

Scuola Digitale. Manuale utente. Copyright 2014, Axios Italia

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database

Java: la libreria delle classi

LITESTAR 4D v Manuale d Uso. WebCatalog Catalogo Elettronico interattivo su Internet. Luglio 2013

Esercitazioni di PROGETTAZIONE DEL SOFTWARE A.A

Introduzione all uso di Eclipse

Il foglio elettronico. Excel PARTE

Come costruire una presentazione. PowerPoint 1. ! PowerPoint permette la realizzazione di presentazioni video ipertestuali, animate e multimediali

Oggetti Lezione 3. aspetti generali e definizione di classi I

E possibile modificare la lingua dei testi dell interfaccia utente, se in inglese o in italiano, dal menu [Tools

Parola chiave extends

EXCEL PER WINDOWS95. sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area di lavoro, detta foglio di lavoro,

GESTIONE DEI PROCESSI

Capitolo 4 Pianificazione e Sviluppo di Web Part

2015 PERIODO D IMPOSTA

Servizio Telematico Paghe

Raffaella Brighi, a.a. 2005/06. Eventi e listener. Corso di Laboratorio II. A.A

FOXWave Gestione gare ARDF IZ1FAL Secco Marco Sezione ARI BIELLA

Università degli Studi di Napoli Parthenope Facoltà di Scienze e Tecnologie Corso di Laurea in Informatica Generale

Guida all'uso del CMS (Content Management System, Sistema di Gestione dei Contenuti)

La struttura dati ad albero binario

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Guida all uso dell ambiente di sviluppo 1 integrato o IDE. JCreator LE 4.50

Applets. Java. Restrizioni delle applets. Restrizioni delle applets

Gestione Filtri. InfoBusiness 2.8 Gestione Filtri Pag. 1/ 11

interfacce ed eventi intercettare il mouse ed altri eventi

Programmazione ad Oggetti. JFrame è la classe di base per le finestre Fornisce tutte le caratteristiche di una finestra vuota

Programmazione in Java Parte I: Fondamenti

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

POSTECERT POST CERTIFICATA GUIDA ALL USO DELLA WEBMAIL

Programmazione in rete e laboratorio

Esercitazione del Corso di Informatica Grafica. Strumenti per scrivere applicazioni in JAVA

per immagini guida avanzata Uso delle tabelle e dei grafici Pivot Geometra Luigi Amato Guida Avanzata per immagini excel

PIANO DI TUTELA DELLE ACQUE DELLA SICILIA (di cui all'art. 121 del Decreto Legislativo 3 aprile 2006, n 152)

Esercitazione n 4. Obiettivi

Gestione delle informazioni necessarie all attività di validazione degli studi di settore. Trasmissione degli esempi da valutare.

filrbox Guida all uso dell interfaccia WEB Pag. 1 di 44

Manuale Utente MyFastPage

1. Le macro in Access 2000/2003

MANUALE D USO DELLA PIATTAFORMA ITCMS

Guida autore all'uso di Lotus Quickr

La prima applicazione Java con NetBeans IDE. Dott. Ing. M. Banci, PhD

IRSplit. Istruzioni d uso 07/10-01 PC

View Mobile User s Guide

Impostare il browser per navigare in sicurezza Opzioni di protezione

appunti delle lezioni Architetture client/server: applicazioni server

Scope e visibilità per classi

Guida all uso di Java Diagrammi ER

Portale tirocini. Manuale utente Per la gestione del Progetto Formativo

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

MANUALE UTENTE. TeamPortal Liste Distribuzioni

Gestione di eventi ed interfacce utente grafiche

BARCODE. Gestione Codici a Barre. Release 4.90 Manuale Operativo

Transcript:

Introduzione al package grafico Swing

Architettura di javax.swing Java supporta direttamente nella propria architettura il concetto di applicazione grafica, tramite il package javax.swing, in cui i componenti vengono direttamente disegnati dalla JVM, e quindi sono indipendenti dalla piattaforma. Il primo package grafico (java.awt, 1996) fu invece implementato in codice nativo, per cui si appoggia alle chiamate del sistema operativo (la grafica dipende dalla piattaforma). Le classi grafiche di Swing estendono quelle di AWT, ed iniziano per J per distinguersi da queste ultime. Tutti i componenti grafici sono dei contenitori (Container), e possono contenere altri componenti. javax.swing JFrame JLabel JButton JTextArea JTextField java.awt Window JDialog... Component Container JApplet JComponent JPanel package javax.swing 2

Frame, finestra di dialogo, applet Una interfaccia grafica swing é normalmente costruita con un pannello principale, un pannello intermedio e dei componenti atomici. Il pannello principale é una frame (JFrame), o una finestra di dialogo (JDialog), oppure una applet (JApplet). Applet Il pannello intermedio é un pannello (JPanel), unico componente del pannello principale, ed adoperato come pannello di altri componenti atomici e/o di altri pannelli. I componenti atomici, visibili effettivamente sull interfaccia, sono: etichetta (JLabel), bottone (JButton), area di testo (JTextArea), campo di testo (JTextField), etc. package javax.swing 3

Frame, pannello e componenti Una finestra viene implementata con una classe che estende JFrame: public class MiaInterfaccia extends JFrame { Nella classe, si dichiarano i campi grafici della frame (i componenti atomici) ed altri campi dato: private JButton[] bottoni; private JLabel[] etichette; private int contatore; Nel costruttore, si invoca super(), si assegnano le proprietà della frame, si invoca un metodo inizializzagui(), e si inizializzano i campi dato. public MiaInterfaccia() { super(); settitle("titolo");... inizializzagui();... contatore = 0; package javax.swing 4

Frame, pannello e componenti Nel metodo inizializzagui(),si crea il pannello intermedio, ossia un pannello (1), e le istanze dei componenti (3); infine si attaccano i componenti al pannello (4), ed il pannello alla frame (5): Quando si aggiungono componenti ad un pannello, la loro posizione é decisa da un gestore di layout, che per default é FlowLayout. In inizializzagui() si può creare un altro gestore, es. GridLayout che li dispone su una griglia m x n (2). JPanel pannello = new JPanel(); //(1) pannello.setlayout( new GridLayout(2,2) ); //(2)... bottoni = new JButton[2]; //(3)... bottoni[i] = new JButton(" Bottone " + i); //(3)... pannello.add(bottoni[i]); //(4) getcontentpane().add(pannello); //(5) package javax.swing 5

GridBagLayout, esempio package javax.swing 6

GridBagLayout, esempio package javax.swing 7

GridBagLayout, esempio //... public class SigemaClient extends JFrame { //... private JPanel pannello; private GridBagLayout gblayout; private GridBagConstraints gbconstraints; private void aggiungicomponente( Component c, int x, int y, int dx, int dy) { gbconstraints.gridx = x; gbconstraints.gridy = y; gbconstraints.gridwidth = dx; gbconstraints.gridheight = dy; gblayout.setconstraints(c, gbconstraints); pannello.add(c); private void inizializzagui() { //... pannello = new JPanel(); gblayout = new GridBagLayout(); gbconstraints = new GridBagConstraints(); pannello.setlayout( gblayout ); pannello.setborder(borderfactory.createlineborder(color.gray,3)); //... gbconstraints.weightx = 0; gbconstraints.weighty = 0; gbconstraints.fill = GridBagConstraints.NONE; gbconstraints.anchor = GridBagConstraints.WEST; aggiungicomponente(titolo, 0, 0, GridBagConstraints.REMAINDER, 1); aggiungicomponente(menu, 0, 1, GridBagConstraints.RELATIVE, GridBagConstraints.RELATIVE); gbconstraints.anchor = GridBagConstraints.CENTER; aggiungicomponente(servizio, 1, 1, GridBagConstraints.REMAINDER, 1); aggiungicomponente(esegui, 1, 2, GridBagConstraints.REMAINDER, GridBagConstraints.RELATIVE); aggiungicomponente(descrizione, 0, 3, GridBagConstraints.REMAINDER, GridBagConstraints.REMAINDER); getcontentpane().add(pannello); //... package javax.swing 8

Frame, aggiornamento dei componenti È possibile nascondere/mostrare i componenti (1) e validarli (2) ossia aggiornarne la raffigurazione. pannello.setvisible(false); //(1) pannello.setvisible(true); pannello.validate(); //(2) Tutti i componenti inseriti in un pannello si possono staccare mediante il numero d ordine di inserimento (3) o un riferimento (4). for (int i=pannello.getcomponentcount();i>=0;i--) pannello.remove(pannello.getcomponent(i)); //(3) pannello.remove(bottoni[j]); //(4) Il metodo java.awt.window.dispose() libera le risorse video native usate dalla frame e dai suoi componenti, marcando tali componenti come non visualizzabili. Il metodo java.awt.window.show() rende visualizzabili la frame e i suoi componenti, ripristinandone lo stato al momento della dispose(), rendendoli visibili, e portando la finestra davanti alle altre. package javax.swing 9

Frame, aggiornamento dei componenti Il metodo java.awt.component.isdisplayable() ritorna true se il componente è visualizzabile, ossia è connesso a risorse video native. Un componente è reso visualizzabile quando è aggiunto ad una gerarchia di contenitori visualizzabili o quando tale gerarchia è resa tale attraverso il metodo show (o pack) sulla frame in alto della gerarchia. Un componente è reso non visualizzabile quando viene rimosso da una gerarchia di contenitori visualizzabili o quando tale gerarchia è resa tale attraverso il metodo dispose. Solo quando tutte le frame sono non visualizzabili, la JVM può terminare la propria esecuzione. Il metodo f.setdefaultcloseoperation(jframe.exit_on_close) provoca l esecuzione di una System.exit() quando l utente chiude la frame cliccando sulla X in alto adestra. In caso contrario, ed in assenza di dispose, la JVM non termina neanche dopo l esecuzione del metodo main. package javax.swing 10

Frame, aggiornamento dei componenti Esempio: l applicazione non termina dopo l esecuzione del metodo main, neanche dopo la pressione del tasto X (il valore predefinito è WindowConstants.HIDE_ON_CLOSE). L utente deve uccidere il processo con CTRL+C. import javax.swing.*; public class JFrameTest { public static void main(string[] args) { JFrame f = new JFrame(); f.show(); // oppure f.setvisible(true); //(1) Inserendo in //(1) l istruzione f.setdefaultcloseoperation(jframe.exit_on_close); l applicazione termina alla pressione del tasto X, mentre inserendo f.dispose(); (in tal caso f.setvisible(false) non è sufficiente) l applicazione termina automaticamente dopo aver eseguito il main. package javax.swing 11

Programmazione ad eventi Nelle applicazioni con interfacce a caratteri, il programmatore ha un forte controllo su quando invocare i metodi, richiedere o emettere dati; l utente é passivo. Il paradigma di sviluppo é READ EVAL PRINT: READ: l utente inserisce i dati di ingresso EVAL: il programma elabora PRINT: l utente legge i dati di uscita Nelle applicazioni dotate di interfacce grafiche interattive, il programmatore ha un lieve controllo sull ordine di esecuzione dei metodi; é l utente che li sceglie mediante la generazione di eventi. Il paradigma di sviluppo é MODEL VIEW CONTROLLER: MODEL: si definiscono campi e metodi VIEW: si definisce la presentazione dei dati CONTROLLER: si definisce il controllo e la gestione degli eventi (in modo analogo agli interrupt hardware). evento: azione eseguita dall utente su un componente attivo dell interfaccia grafica (es. la pressione di un tasto, il movimento o il click del mouse). Esistono diverse classi di eventi, che estendono EventObject, e sono contenute nel package java.awt.event. package javax.swing 12

Evento, sorgente, ascoltatore La JVM genera un oggetto evento, della classe opportuna, ad ogni interazione con una sorgente di eventi (componente grafico), che sia stata opportunamente registrata (2), ossia associata ad un oggetto ascoltatore (o gestore) dell evento (1), es. in inizializzagui(): ActionListener gestore = new AscoltatorePremiBottone(this); //(1)... bottoni[0].addactionlistener(gestore); //(2) L ascoltatore di uno o più tipi di evento é una classe, definita dal programmatore in un altro modulo, che deve implementare l interfaccia EventListener o le sue estensioni. Essa deve contenere un campo (5) che viene inizializzato con l oggetto frame specifico che contiene le sorgenti (1), ed un metodo predefinito per ogni tipo di evento (3), che invoca quindi un metodo della frame (4) con istruzioni relative all evento. public class AscoltatorePremiBottone implements... public void actionperformed(actionevent e) { //(3) interf.conteggiabottone();... //(4) private MiaInterfaccia interf; //(5) package javax.swing 13

Evento, sorgente, ascoltatore package javax.swing 14

Semplice interfaccia grafica // MiaInterfaccia.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MiaInterfaccia extends JFrame { // costruttore public MiaInterfaccia() { super(); settitle("titolo"); setsize(400,100); setdefaultcloseoperation(jframe.exit_on_close); inizializzagui(); show(); contatore = 0; // altri metodi private void inizializzagui() { // crea il pannello intermedio (pannello) JPanel pannello = new JPanel(); // crea gestore del layout pannello.setlayout( new GridLayout(2,2) ); // crea i componenti bottoni = new JButton[2]; etichette = new JLabel[2]; for (int i = 0; i < bottoni.length; i++) { bottoni[i] = new JButton(" Bottone " + i); etichette[i] = new JLabel(" Etichetta " + i); // crea i gestori di eventi ActionListener gestore = new AscoltatorePremiBottone(this); // associa i componenti ai rispettivi gestori bottoni[0].addactionlistener(gestore); // attacca i componenti al pannello for (int i=0; i<bottoni.length; i++) { pannello.add(bottoni[i]); pannello.add(etichette[i]); // attacca il pannello alla Frame getcontentpane().add(pannello); public void conteggiabottone() { contatore++; etichette[0].settext(" Bottone premuto " + contatore + " volte"); public static void main(string[] args) { new MiaInterfaccia(); // campi interfaccia private JButton[] bottoni; private JLabel[] etichette; // campi dato private int contatore; package javax.swing 15

Semplice interfaccia grafica // AscoltatorePremiBottone.java import java.awt.event.*; public class AscoltatorePremiBottone implements ActionListener { public AscoltatorePremiBottone( MiaInterfaccia interfaccia) { interf = interfaccia; public void actionperformed(actionevent e) { interf.conteggiabottone(); private MiaInterfaccia interf; Il metodo Object getsource() restituisce il riferimento alla sorgente, e può servire a gestire più sorgenti di eventi dello stesso tipo. // MiaInterfaccia.java (modifiche)... public int trovabottone(jbutton b) { for (int i=0; i<bottoni.length; i++) if (b==bottoni[i]) return i; return -1; // AscoltatorePremiBottone.java (modifiche) import java.awt.event.*; import javax.swing.*;... public void actionperformed(actionevent e) { int i = interf.trovabottone( (JButton)e.getSource()); interf.conteggiabottone(i); package javax.swing 16

Ascoltatori principali Interfaccia ActionListener ComponentListener FocusListener ItemListener KeyListener MouseMotionListener MouseListener TextListener WindowListener Tipo di eventi Quando si premono bottoni, selezionano voci di menù, si preme invio mentre si scrive in un campo di testo Quando un componente viene nascosto, spostato, mostrato o ridimensionato Quando un componente ottiene o perde il focus Quando un elemento (es. di una lista) viene selezionato o deselezionato Quando viene premuto, rilasciato, battuto un tasto Quando il mouse viene trascinato o spostato Quando si clicca, si rilascia, si entra, si esce, sul componente Quando cambia il valore di un campo testo Quando la finestra viene attivata, chiusa, disattivata, ripristinata, ridotta a icona, etc. package javax.swing 17

Applet Applet: piccolo programma, scritto in Java per essere eseguito come componente embedded di un altra applicazione, tipicamente un browser. Occorre abilitare il browser ad eseguire del bytecode, quindi integrarlo con un Java Runtime Environment (una JVM). Dal punto di vista di Java, una Applet JApplet Dal punto vista del browser, una pagina html riferisce una Applet come un proprio componente, specificando opportuni attributi (come le dimensioni del riquadro, la main-class) o parametri di ingresso. <!-- miapagina.html --> <APPLET CODE = Disegna.class CODEBASE = miadir WIDTH = 400 HEIGHT = 400 > <PARAM NAME = MIOFILE VALUE = input.txt > <PARAM NAME = MIOTEST VALUE = true > </APPLET> package javax.swing 18

Applet Il browser riserva alla applet un suo spazio nella pagina, ne scarica il codice e la esegue, gestendola con opportuni metodi: init(), inizializza l applet, eseguito ogni volta che viene caricata o aggiornata start(), dopo la creazione dell applet, per animazioni o lanciare thread stop(), quando si vuole fermare l esecuzione dei thread destroy(), cleanup finale, alla terminazione paint(graphics g), invocato da update(), per disegnare sul pannello update(graphics g), invoca paint(), per aggiornare i disegni. Graphics rappresenta la superficie su cui si può disegnare immagini, forme, stringhe (con drawstring()), etc. Un applet non é eseguibile come applicazione a sè, non ha un main ed un Frame che la contenga. È possibile aggiungere un metodo main il quale crea un JFrame, aggiunge ad esso una JApplet (invece che JPanel) ed invoca esplicitamente l init(). Se l applet viene eseguita da un browser, il main In alternativa, è possibile estendere la JApplet con una nuova classe che includa il main package javax.swing 19

Applet con disegni <!-- miapagina.html --> <APPLET CODE = Disegna.class WIDTH = 400 HEIGHT = 400 > </APPLET> // Disegna.java import javax.swing.*; import java.awt.*; public class Disegna extends JApplet { public void paint(graphics g) { int cx = getsize().width/2, cy = getsize().height/2; int x = cy, y = cy, d = 16; for(int i=0;i<40;i++) { g.drawline(cx+x,cy+y,cx-y,cy+x); g.drawline(cx-y,cy+x,cx-x,cy-y); g.drawline(cx-x,cy-y,cx+y,cy-x); g.drawline(cx+y,cy-x,cx+x,cy+y); int tmp = -(y+x)/d; y += (x-y)/d; x += tmp; x = getsize().width/2; y = getsize().height/2; d = (x+y)/(2*d); g.setcolor(color.green); g.fillrect(x-d,y-d,2*d,2*d); g.setcolor(color.red); g.drawrect(x-d/2,y-d/2,d,d); g.setcolor(color.blue); g.drawstring("a",x-d/4,y+d/4); Digitando appletviewer pagina.html ovvero aprendo la pagina con un browser: package javax.swing 20

Applet con lista di controllo <!-- miapagina.html --> <APPLET CODE = CheckList.class WIDTH = 100 HEIGHT = 200 > </APPLET> // CheckList.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CheckList extends JApplet implements ItemListener { public void init(){ txt = new JTextField("Seleziona i preferiti",25); txa = new JTextField(25); txt.seteditable(false); txa.seteditable(false); ck = new JCheckBox[5]; ck[0]=new JCheckBox("Rosso");... ck[4]=new JCheckBox("Verde"); for (int i=0; i<5; i++) ck[i].additemlistener(this); Container c = getcontentpane(); c.setlayout(new GridLayout(7,1)); c.add(txt); for (int i=0; i<5; i++) c.add(ck[i]); c.add(txa); public void itemstatechanged(itemevent e){ int cont = 0; for (int i=0; i<5; i++) if (ck[i].isselected()) cont++; txa.settext(cont + " colori selezionati"); private JTextField txt,txa; private JCheckBox ck[]; Il metodo itemstatechanged viene automaticamente invocato dopo un ItemEvent. Digitando appletviewer pagina.html ovvero aprendo la pagina con un browser: package javax.swing 21

Applet e sicurezza Una applet può essere caricata dal File System o dalla rete. Se l applet arriva dalla rete, essa viene sottoposta alle restrizioni imposte dal Security Manager (SM) della JVM residente nel browser. Un SM può essere completamente personalizzabile ma non può essere modificato da un applet. Ogni browser ha un solo manager. I potenziali problemi di sicurezza causati da codice eseguibile sono: Integrity attacks (modifiche a file e memoria, chiusura processi) Availabilities attacks (allocazioni abnormi di memoria, di finestre, modifiche alla priorità dei processi) Disclosure attacks (prelievo di informazioni private) Annoyance attacks (visualizzazioni ed emissioni sonore fastidiose) package javax.swing 22

Applet e sicurezza Ad ogni esecuzione di metodo la JVM consulta il SM, che genera una SecurityException se lo considera potenzialmente pericoloso. Il SM controlla anche: le operazioni sui Socket (connect,accept ) gli accessi al File System per proteggere file e dati personali la creazione di programmi di sistema, chiamate ai processi di sistema Un applet non firmata: non puo caricare librerie o definire metodi nativi non puo leggere o scrivere file sul sistema su cui e in esecuzione, né avviare programmi non puo effettuare connessioni attraverso la rete se non con l host da cui proviene non puo leggere alcune propieta del sistema package javax.swing 23