java - Dipartimento di Informatica

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)