Esercitazione del Corso di Informatica Grafica Strumenti per scrivere applicazioni in JAVA Perché Java Indipendenza dalla piattaforma Un’applicazione scritta in Java può essere facilmente spostato da un sistema di calcolo ad un altro. Un programma Java viene compilato in un codice intermedio detto bytecode (file con estensione .class). I file di codice intermedio vengono interpretati dalla Java Virtual Machine(JVM). La JVM è un programma scritto mediante un qualunque linguaggio di programmazione dipendente dalla piattaforma, e traduce le istruzioni Java, nella forma di bytecode, in istruzioni native del processore locale. Si può cambiare la piattaforma, ma il bytecode rimane lo stesso. ...Perché Java Uso della memoria Java mette a disposizione un meccanismo detto “Garbage Collector”. Il Garbage Collector, tiene traccia degli oggetti utilizzati da una applicazione Java, nonché delle referenze a tali oggetti. Ogni volta che un oggetto non è più referenziato per tutta la durata di uno specifico intervallo di tempo, viene rimosso dalla memoria e la risorsa liberata viene di nuovo messa a disposizione della applicazione che potrà continuare a farne uso. N.B.: Questo meccanismo è in grado di funzionare correttamente in quasi tutti i casi anche se molto complessi, ma non si può dire che è completamente esente da problemi. Concetti chiave Dati: Pagine (testo, note, immagini,...) Azioni: sfogliare, leggere, ... Libro Oggetto Insieme di libri Classe Classe descrizione generale del concetto (di libro) Oggetto è un’istanza di classe (ossia un libro specifico) ...Concetti chiave In Java: Una Classe descrive le caratteristiche (attributi) e il comportamento (azioni) comune all’insieme di oggetti che essa descrive. Attributi Dati o variabili di istanza Azioni Metodi ...Concetti chiave - Incapsulazione: meccanismo che lega il codice ai dati che manipola. L’accesso ai dati incapsulati è controllato da un’interfaccia ben definita. - Ereditarietà: è il processo tramite il quale una sottoclasse acquisisce tutte le proprietà di ciascuna delle classi che la precedono nella gerarchia. - Polimorfismo: consente di avere operazioni distinte ma con lo stesso nome(overriding e overloading dei metodi). Java SDK SDK Software Development Kit JRE Java Runtime Environment JVM (Java Virtual Machine) Sito: http://java.sun.com/ Java SDK: TOOLS javac – Compilatore Java java – Interprete Java appletviewer – Browser Java javadoc – Tool per la documentazione automatica jdb – Tool di debug java Java Java Source File Java Compiler (.java file) (javac) Programma JAVA Java Runtime System Host Machine Compiled Bytecode (.class file) Java Virtual Machine (java, appletviewer) Operating System Come costruire programmi in Java Si scrivono con: - un editor di testi (come Blocco note, WordPad ...) - un ambiente di sviluppo( JBuilder, JCreator …) Si salvano con: Nome.java ...Come costruire programmi in Java... Si compilano con: - il compilatore Java è denominato JAVAC fornito con SDK: javac Nome.java - se la compilazione ha esito positivo, viene prodotto: Nome.class Questo è il file di bytecode ...Come costruire programmi in Java Si interpretano con: - per applicazioni Java, l’interprete è denominato JAVA fornito con SDK: java Nome dove utilizzo il file Nome.class che ho creato al momento della compilazione Obiettivo Cosa serve Il SDK è dotato di uno dei seguenti package per costruire GUI: • Java AWT (Abstract Windows Toolkit): package java.awt import java.awt.*; • Java SWING: package javax.swing import javax.swing.*; Java AWT Il package Abstract Window Toolkit, mette a disposizione del programmatore una serie di classi e Interfacce per la gestione di GUI. Java SWING Swing è stato interamente scritto in Java, usando il package awt, e mette a disposizione dell'utente tante classi presenti anche in awt, ma notevolmente migliorate e potenziate. Dispone, inoltre, di tante altre classi non presenti in awt. Definizione di una classe JFrame Il pacchetto Swing mette a disposizione la classe JFrame per costruire una finestra di interazione. Ho bisogno di estendere la classe base, fornita dal pacchetto swing, così che la classe che vado a costruire ne erediterà metodi, eventi e proprietà. La nuova classe, manterrà tutti i dati ed i metodi membro della superclasse con la possibilità di aggiungerne di nuovi o modificare quelli esistenti. public class Nome extends JFrame{ } ...Definizione di una classe JFrame public class Nome extends JFrame{ type var1; … type varN; Dichiarazione dati return_type method_name1(type name1, [type name,...]) { istruzioni } ... return_type method_nameM(type name1, [type name,...]) { istruzioni } Definizione metodi } Componenti JLabel JTextField JCheckBox JLabel + ImageIcon …Componenti All’interno della definizione di classe, dichiaro i differenti oggetti da visualizzare nel frame: JLabel lblDrug = new JLabel("Drug Name:"); JTextField txtDrug = new JTextField(); JCheckBox chbTablets = new CheckBox("tablets"); JLabel lblImg1 = new JLabel(); N.B.: Per usare queste classi facenti parte del pacchetto javax.swing, le devo importare con: import javax.swing.*; Dichiarazione oggetti Creo una variabile che referenzia l’oggetto: class_type prova; in questo modo prova è una variabile speciale che tiene traccia di istanze di tipi non primitivi. Con class_type si intende una delle classi appartenente alle API di Java oppure definite dal programmatore. Nel nostro caso, per esempio: JLabel lblDrug; utilizzo la classe Java “JLabel” appartenente al pacchetto Swing. ...Dichiarazione oggetti Creata la variabile reference, passo ad istanziare l’oggetto utilizzando l’operatore new, nel seguente modo: prova = new class_type() ; L’operatore new alloca la memoria necessaria per l’oggetto class_type e restituisce la locazione di memoria della entità creata, assegnandola alla variabile reference prova. Questa locazione può essere utilizzata per accedere all’oggetto quando necessario. Nel nostro esempio: lblDrug = new JLabel("Drug Name:"); JPanel In Java esiste il concetto di Pannello: si tratta di un generico contenitore di componenti, utilizzato essenzialmente per dare un ordine alla collocazione delle componenti nel frame. Come dichiararlo: JPanel north =new JPanel(); JPanel south =new JPanel(new GridLayout(2,3)); GridLayout implementa l’interfaccia LayoutManager, mi permette di dividere la componente in una griglia rettangolare. ...JPanel North South Metodo jbInit() E’ buona regola organizzare l’insieme delle istruzioni utilizzate per inizializzare le componenti di un’interfaccia in un unico metodo: void jbInit(){ Istruzioni } in questo setto le proprietà di ogni componente, e lo aggiungo al frame principale. Settare proprietà Pannello north.setLayout(null); Setto il Layout a null, in maniera tale che possa gestire da x codice le proprietà della componente, y north.setBounds(0,0,230,150); Ne setto posizione e dimensione con il metodo setBounds. north.setBackground(new Color(200,200,200)); Definisco il background del pannello, utilizzando le coordinate colore RGB nell’intervallo (0,…,255), tramite la classe Color() Color(int r, int g, int b) Settare proprietà JLabel north.add(lblDrug); tramite il metodo add del pannello, aggiungo la JLabel al pannello north. lblDrug.setBounds(5,5,70,25); Ne setto posizione e dimensione con il metodo setBounds. Settare proprietà JCheckBox north.add(chbTablets); aggiungo la componente al pannello nord chbTablets.setBounds(70,30,70,25); ne setto posizione e dimensione chbTablets.setFont(new Font("SansSerif",1,10)); setto il carattere della label associata alla componente, tramite l’utilizzo della classe Font(String name, int style, int size) passata come parametro al metodo setFont Settare proprietà JLabel con Icone lblImg1.setIcon( new ImageIcon("images/triangolo2.gif")); questo è il metodo usato per settare l’icona della JLabel, la sintassi è la seguente: oggetto.setIcon(Icon icon) La classe Icon è un’interfaccia, di cui ho utilizzato l’implementazione ImageIcon, passata come parametro al metodo. Tale classe mi permette di creare un’immagine da uno specifico percorso. ...Settare proprietà JLabel con Icone lblImg1.setHorizontalAlignment(SwingConsta nts.CENTER); Setto la posizione dell’immagine nella label della griglia, utilizzando la costante SwingConstants.CENTER lblImg1.setVerticalTextPosition( SwingConstants.BOTTOM); lblImg1.setHorizontalTextPosition( SwingConstants.CENTER); setto la posizione verticale ed orizzontale del testo contenuto nella label con, rispettivamente SwingConstants.BOTTOM e SwingConstants.CENTER ...Settare proprietà JLabel con Icone lblImg1.setText("Interactions"); setto il testo che compare nella label nella posizione definita dai due metodi precedenti, lblImg1.setFont(new Font("SansSerif",1,9)); ed il tipo di carattere con il metodo setFont lblImg1.setBounds(5,5,63,60); setto le dimensioni della label lblImg1.setEnabled(false); disabilito la label utilizzando il metodo “setEnabled” e passando come parametro false south.add(lblImg1); ed infine, aggiungo la label al pannello sud Settare proprietà JFrame java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit(). getScreenSize(); Toolkit è una classe astratta del pacchetto AWT, tramite il metodo getScreenSize() ricavo la dimensione dello schermo salvandola nella variabile di reference screenSize. setLocation((screenSize.width - 230) / 2, (screenSize.height - 300) / 2); Posiziono il frame tenuto conto delle sue dimensioni e di quelle dello schermo. setSize(new java.awt.Dimension(230, 300)); Definisco le dimensioni del frame. pack() Ridimensiono il frame in base alle componenti in esso contenute. Aggiungere controlli al JFrame getContentPane().add(north) aggiungo al frame principale il pannello nord e sud, la sintassi del metodo utilizzato è la seguente: getContentPane().add(name_compon ent) dove in questo caso name_component è il singolo pannello, ma potrebbe essere una delle componenti elencate precedentemente. Costruttore di classe I costruttori sono metodi speciali chiamati quando viene creata una nuova istanza di classe e servono ad inizializzare lo stato dell’oggetto, non restituiscono nessun tipo. Nome(){ try{ } jbInit(); Nome della classe: Nome.java } catch(Exception e){ e.printStackTrace(System.out); } Blocco try…catch Compito dell’istruzione catch è quello di gestire le eccezioni, ma è accompagnata da un blocco try, utilizzato come controllore di un blocco di istruzioni, potenziali causa di una eccezione. Try ha la sintassi seguente: try{ istruzioni } catch(Exception var1){ istruzioni }….. L’istruzione catch cattura solamente le eccezioni di tipo compatibile con il suo argomento e solamente quelle generate dalle chiamate a metodi racchiuse all’interno del blocco try. Metodo main() Per eseguire la classe costruita, è necessario inserire nel codice della classe che si sta implementando un metodo standard, chiamato main(). Segue la sintassi: class Name { public static void main(String args[]){ ……… } } Questo metodo viene detto “entry point” dell’applicazione. Nel nostro caso: public static void main(String args[]){ Name frame = new Name(); frame.show(); Esempio } Bottoni in Java Dichiarazione: JButton esempio = new JButton(); JButton esempio = new JButton(String txt); Come ogni componente di un JFrame, posso settarne le proprietà, posizionarlo nel frame. …Bottoni in Java: evento Click Il JButton dispone di un metodo chiamato void addActionListener(ActionListener l) aggiunge al bottone lo specifico ActionListener per captare gli eventi associati ad esso. ActionListener è definito nel package java.awt.event, si tratta di un’interfaccia, i cui metodi vanno implementati. L’unico metodo è actionPerformed(), definito nel seguente modo: public void actionPerformed(ActionEvent e) è questo il metodo che verrà invocato quando si cliccherà sul bottone. ActionEvent contiene tutte le informazioni riguardanti l’evento (per esempio il tasto pigiato in un gruppo di tasti) N.B.: Se nessun ActionListener è definito, non verrà eseguita alcuna azione al click del mouse. …Bottoni in Java: evento Click void jbInit(){ Passo come parametro Container cF; buttonPress bP = new buttonPress(); l’istanza di buttonPress ……… al metodo btnOK.addActionListener(bP); addActionListener() ………. } class buttonPress implements java.awt.event.ActionListener { public void actionPerformed(java.awt.event.ActionEvent e){ if(e.getSource()==btnOK) System.out.println("OK"); buttonPress implementa …….. l’interfaccia } ActionListener } …Bottoni in Java: evento Click btnOK.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ // Stampa a video la stringa “OK” System.out.println("OK"); } }); Implemento il metodo actionPerformed() dell’interfaccia ActionListener direttamente nella chiamata all’addActionListener() del JButton(). N.B.: avrò una differente implementazione del metodo actionPerformed() per ogni bottone utilizzato Commenti: JavaDoc In Java è possibile costruire automaticamente pagine HTML con la documentazione del codice scritto. Cosa si deve fare: - scrivere un codice commentato (saranno considerati i commenti che cominciano per /**) - eseguire il comando javadoc [<nomefile> | <nomepackage>] vengono prodotti una serie di file HTML con la documentazione per <nomefile> o <nomepackage> ...Commenti: JavaDoc All’esecuzione del comando javadoc, vengono prodotti i seguenti files: • uno per ogni classe public nei <nomefile> • uno per ogni package in <nomepackage> • uno con l’indice alfabetico dei nomi di classi, metodi attributi • uno con l’indice di tutti i packages • uno con la gerarchia di tutte le classi Java for Imaging Le nuove API Java 2D estendono le funzionalità di base del modello di imaging del pacchetto AWT per fornire un supporto per la grafica 2D e l’imaging. Il pacchetto da considerare è java.awt in particolare java.awt.image Da richiamare con: import java.awt.*; import java.awt.image.*; Per iniziare… Classe CANVAS Permette di definire un’area all’interno di un’applicazione, utilizzabile per le operazioni base per la grafica. Può essere posizionata in un frame utilizzando i gestori dei layers. Va estesa dall’utente, e va ridefinito il metodo paint() per eseguire un’applicazione personalizzata …Per iniziare… Operazioni consentite: - disegnare linee - disegnare figure - posizionare immagini - gestire eventi legati alla grafica La classe Canvas è parte del pacchetto AWT richiamabile con: import java.awt.Canvas; …Per iniziare… import java.awt.*; import java.awt.event.*; class MyExampleCanvas extends Canvas { public MyExampleCanvas() {} public void paint(Graphics g){ g.drawString("Prova canvas"); g.drawline(1,1,mouseX,mouseY); //disegna una linea g.setColor(Color.red); //ne setta il colore } } … } …Per iniziare import java.awt.*; import java.awt.event.*; class canvasView extends Frame { MyExampleCanvas canvas = new MyExampleCanvas(); public canvasView () {} public static void main(String args[]) { Frame f = new Frame("The Graphic Canvas Frame"); f.setLayout(new BorderLayout()); f.add(canvas, BorderLayout.CENTER); … } } Links utili • Java Mattone dopo Mattone: http://lab27.dmi.unict.it/jmonline/introduzione/ind ice.htm • Guida al linguaggio Java: http://programmazione.html.it/java/ • Thinking in Java, Bruce Eckel: http://www.comment.it/bruceEckel/ • Tutorial su Java: http://java.sun.com/docs/books/tutorial/index.html ...Links utili • JVM (Java Virtual Machine): http://java.sun.com/j2se/1.4.2/index.html • Tools: – JCreator (free) – JBuilder – Eclipse (free)