Con il painting diretto della immagine sulla superficie del RiquadroFoto, non servirebbero più né il JLabel né il ImageIcon.
Con il painting diretto della immagine sulla superficie del RiquadroFoto, non servirebbero più né il JLabel né il ImageIcon.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
se osservi bene io utilizzo il paintComponent per modificare anche il jlabel e ottenere una nuova istanza scalta dell'immagine . l'unico problema è che adesso non so più perchcè ma il metodo setbackground non funziona !
Ma non servirebbe più .....
Scritto (e abbozzato) al volo:
codice:public class RiquadroFoto extends JPanel { private Image imgFoto; ..... public void caricaImmagine(File file) { // ..... carica immagine e assegna a imgFoto. repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(imgFoto, 0, 0, getWidth(), getHeight(), this); } ..... }
Grosso modo è proprio tutto qui ....
E infine:
1) nota che paintComponent è, originalmente in JComponent, protected. Se non ci sono motivi davvero reali, è bene tenerlo protected!
2) super.paintComponent(g); .... non super.paintComponents(g);
paintComponents è per altro.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
scusa se ti disturbo mi potresti spiegare un po la differenza tra paintcomponent , paint e update!! grazie
Questo: Painting in AWT and Swing spiega di più e meglio (di quanto potrei fare qui io).
Ma se vuoi posso farti un mini condensato stile bignami ...![]()
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ok, rispondo adesso con un breve riassunto del painting.
Il metodo paint(Graphics) dei componenti grafici esiste fin dall'inizio di AWT, cioè praticamente da sempre.
I Componenti AWT sono "heavyweight", cioè hanno la loro finestra nativa e sono quindi disegnati dal sistema operativo. Quando AWT determina che un componente deve essere ridisegnato (tutto o in parte), viene invocato paint(Graphics). Esiste in AWT anche update(Graphics). La distinzione tra i due esiste perché c'è differenza tra il painting "system-triggered" a "app-triggered". Nel primo caso succede quello che ho detto prima: è paint che viene direttamente invocato.
Quando invece è l'applicazione che richiede un ridisegno con repaint(), viene causata l'invocazione di update, che per default fa nient'altro che invocare paint. Ridefinendo update c'è la possibilità di effettuare un painting "incrementale".
In Swing (dove i componenti sono "lightweight", disegnati da codice Java) le cose vanno un po' diversamente. Innanzitutto nei componenti Swing il paint(Graphics) esiste comunque ancora, perché è solo quello il metodo che rappresenta il "contesto" di disegno del componente.
Il paint tuttavia fattorizza (suddivide) il lavoro di disegno in 3 fasi, rispettivamente e in quest'ordine:
- paintComponent(Graphics g)
- paintBorder(Graphics g)
- paintChildren(Graphics g)
In Swing il "contesto" di disegno in cui si può fare del custom painting è paintComponent. paint non andrebbe ridefinito (se non per casi davvero particolari e sapendo bene che cosa si sta facendo). Gli altri due metodi paintBorder/paintChildren sono già implementati in modo standard e generalmente non sono mai da ridefinire.
La tecnica del painting "incrementale" tramite update() non va più usata, in pratica lavorando con i componenti Swing ci si può del tutto dimenticare dell'esistenza di update().
Questo grosso modo è il concetto.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ho un problema sempre col riquadro , se provo a rimuovere la icon dalla jlabel essa resta,
codice:public void inserisciFoto(File fileSelezionato) throws IOException { if(fileSelezionato!=null){ this.fileFoto=fileSelezionato; this.foto=Toolkit.getDefaultToolkit().createImage(this.fileFoto.getCanonicalPath()); Dimension dim=this.getPreferredSize(); this.labelFoto.setIcon(new ImageIcon(foto.getScaledInstance(dim.width, dim.height, Image.SCALE_SMOOTH))); } else { this.labelFoto.setIcon(null); this.labelFoto.revalidate(); this.labelFoto.repaint(); } }
Ultima modifica di linux_r; 26-06-2014 a 11:45
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
resta sempre la stessa immagine !!