View Single Post
Old 18-10-2003, 15:03   #4
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
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.
PGI è offline   Rispondi citando il messaggio o parte di esso