Grafica e immagini

Transcript

Grafica e immagini
Grafica e immagini
in java
Classi Graphics e Graphics2D
awt
• Le classi Graphics e Graphics2D
definiscono la superficie di disegno.
• In pratica ogni contenitore ha
implicitamente un suo oggetto interno di
classe Graphics
• Qualsiasi oggetto Component ha un
metodo paint( Graphics g ) di cui si puo
fare l'ovveride
Metodo paint
• Il metodo paint è automaticamente
richiamato dalla vm ogni volta che
l'oggetto deve essere ridisegnato:
– Resize finestra o oggetti
– Scrolling, ecc.
• Sempre in modo automatico viene
passato l'oggetto Graphics come
argomento (modalità callback)
repaint
• Si può manualmente fare in modo che
l'oggetto sia ridisegnato, chiamando il
metodo repaint() che a sua volta richiamerà
il metodo update che cancella la superficie
di disegno e riscrive l'oggetto (tramite il
metodo paint)
• In generale è consigliabile chiamare il
metodo repaint() anziché direttamente paint
con l'oggetto grafico.
Componenti swing
• Qualche piccola differenza:
– Il metodo update() richiama direttamente il
paint
– Il metodo paint() chiama 3 metodi
• paintComponent() //disegbi su componente
• paintBorder() //disegno bordi componente
• paintChildren() //disegno ogg. contenuti
Le immagini e l'osservatore
• ci sono 2 metodi di caricare immagini;
– (awt) Toolkit.getImage() con cache e
.createImage()
ASINCRONO
– (swing) ImageIcon SINCRONO
• all'interno di un progetto netbeans
conviene creare una cartella
manualmente a livello del progetto
ImageIcon
• new ImageIcon(“nomefile o url”) • il costruttore termina con il caricamento dell'immagine
(o con uno stato di errore)
• caricamento dell'immagine sincrono
• Questa classe ha i metodi:
– getIconWidth(), getIconHeight()
– getImageLoadStatus() che può assumere uno di 4 valori:
MediaTracker.ABORTED, MediaTracker.COMPLETE,
MediaTracker.ERRORED, MediaTracker.LOADING
ImageIcon: alcuni metodi
• new ImageIcon(“nomefile o url”) • il costruttore termina con il caricamento dell'immagine
(o con uno stato di errore)
• caricamento dell'immagine sincrono
• Questa classe ha i metodi:
– getIconWidth(), getIconHeight()
– getImageLoadStatus() che può assumere uno di 4 valori:
MediaTracker.ABORTED, MediaTracker.COMPLETE,
MediaTracker.ERRORED, MediaTracker.LOADING
ImageIcon
• Un oggetto di classe ImageIcon può
essere passato al costruttore di una
JLabel...
• Si può invece ottenere un oggetto di
classe Image con il metodo getImage()
• Se l'immagine ha delle trasparenze (gif o
png), la JLabel sarà trasparente
indipendentemente da altre impostazioni
JLabel()
Oltre alla sintassi JLabel(ImageIcon) è
possibile sfruttare la capacità di questa
classe di gestire l'html, utilizzando ad
esempio il tag img.
• indirizzo web
• indirizzi fisici (es.: file:///home/..../)
percorso completo
JLabel()
Oltre alla sintassi JLabel(ImageIcon) è
possibile sfruttare la capacità di questa
classe di gestire l'html, utilizzando ad
esempio il tag img.
• indirizzo web
• indirizzi fisici (es.: file:///home/..../)
percorso completo
z-index di JLabel
• di default il primo componente aggiunto ad
un Jframe risulta piu in alto di tutti gli altri.
• è possibile gestire la z-index di più JLabel
nello stesso contenitore in questo modo:
– ottenere il contenitore:
• Container c = lab1.getParent();
– utilizzare il metodo setComponentZOrder che
ha 2 parametri: l'elemento e l'indice
• c.setComponentZOrder(lab1, 3)
z-index
• è possibile sapere l'ordine attuale del dingolo
elelmento contenuto nel contenitore con il
metodo del contenitore
.getComponentZOrder(elem)
• il livello piu alto viene ridisegnato per primo
quindi, in pratica il livello 0 è sopra tutti e più il
numero e basso, piu il disegno sembra essere
sopra (diveramente dai css)
• Si possono assegnare solo livelli esistenti (es.:
se ci sono 4 oggetti avremo 0,1,2,3)
getImage e createImage
• I metodi awt sono asincroni, cioè vengono
eseguiti in pochissimo tempo e ritornano
anche se l'immagine non è stata ancora
caricata.
• Ovviamente in questo periodo di tempo
l'eventuale accesso a metodi get daranno
valori inesatti (es: -1)
awt e osservatore
• l'interfaccia ImageObserver ha il metodo
imageUpdate