esempio supercondensato.
Codice:
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.awt.geom.*;
public class MainClass extends JPanel{
Image img=null;
private int counter=0;
public MainClass(int counter) {
img=new ImageIcon("c:\\immagine.gif").getImage();
this.counter=counter;
this.setPreferredSize(new Dimension(img.getWidth(this), img.getHeight(this)));
}
public void decreaseCounter() {
counter--;
repaint();
}
public int getCounter() {
return counter;
}
public void paint(Graphics g) {
if(img!=null) {
//disegna l'immagine sullo sfondo
g.drawImage(img,0,0,this);
//disegna la stringa
g.setFont(new Font("Verdana", Font.BOLD|Font.PLAIN, 14));
String s=String.valueOf(counter);
int x=img.getWidth(this)/2-g.getFontMetrics().stringWidth(s)/2;
int y=g.getFontMetrics().getHeight();
g.setColor(Color.BLACK);
g.drawString(s, x, y);
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame frame=new JFrame("Main");
frame.getContentPane().setLayout(new FlowLayout());
final MainClass c=new MainClass(100);
frame.getContentPane().add(c);
ActionListener al=new ActionListener() {
public void actionPerformed(ActionEvent a) {
c.decreaseCounter();
}
};
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.show();
Timer timer=new Timer(1000, al);
timer.start();
}
}
Quello che ci interessa è in sostanza il solo contenuto del metodo "paint".
Benchè si possa manipolare un'immagine con il suo oggetto Graphics, è meglio costruirsi un componente grafico (in questo caso un JPanel) e sfruttare il suo metodo paint(Graphics g).
Quel "Graphics g" corrisponde a tutto ciò che viene disegnato sullo schermo in corrispondenza del componente.
La prima cosa che fa il nostro "paint" è disegnare l'immagine, che va a coprire lo sfondo del componente:
g.drawImage(img, 0, 0, this).
poi calcola la dimensione della stringa con l'oggetto FontMetrics e "scrive" il risultato al centro dell'immagine:
g.drawString(s, x, y);
Poichè il metodo paint() viene richiamato anche durante la costruzione e l'update dei componenti grafici è bene tenere separata la parte che modifica la stringa da stampare con l'operazione di disegno vero e proprio.
Nell'esempio c'è un metodo "decreaseCounter" che modifica il contatore. Quel metodo decrementa il contatore e poi effettua un update della grafica chiamando "repaint()" (metodo che MainClass eredita da JPanel->...->Component).
&Ciao.