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