Documentazione

Alcuni Link Interessanti che permettono di comprendere meglio quanto esposto in seguito:

  1. http://www3.ntu.edu.sg/home/ehchua/programming/index.html
  2. http://www3.ntu.edu.sg/home/ehchua/programming/java/J4b_CustomGraphics.html#show-toc
  3. http://www3.ntu.edu.sg/home/ehchua/programming/java/J8b_Game_2DGraphics.html

La Classe BufferedImage

La classe BufferedImage \xE8 una sottoclasse di Image ed anzich\xE9 essere appoggiata ad un dispositivo \xE8 appoggiata alla memoria della macchina. Il suo costruttore

BufferedImage( int w, int h, imagetype)

ha 3 parametri di cui l'ultimo \xE8 una costante listata nei Field and Description QUI

Disegnare su una BufferedImage segue le stesse metodologie che disegnare su ogni altro dispositivo, quindi il disegno passa atttraverso la creazione di un oggetto Graphics2D appoggiato all'oggetto. LayoutManager

Immagini e BorderLayout

Le immagini delle classi indicate in precedenza non possono essere immediatamente collocate all'interno di un Oggetto. Nel caso si voglia includere un'immagine in in un "settore" del BorderLayout \xE8 necessario
  • creare un oggetto Component
  • dotarlo di un oggetto che consenta per esempio la gestione di immagini offscreen cio\xE8 nella memoria anzich\xE9 direttamente sul dispositivo di output onscreen come per esempio un oggetto della classe BufferedImage

Creazione della Sottoclasse

La classe creata che deve essere un'estensione della classe Component come nel seguente breve brano di codice
import java.awt.*; 
import java.awt.image.*; 
import java.awt.geom.*; 
import java.util.Date; 
import java.awt.event.*;

public class DoubleBuffering extends Component 
{ 
  private static BufferedImage theBackground; 
  private static Graphics2D g2dBackground; 
  private BufferedImage theImage; 
  private Graphics2D g2dImage; 
  private int width;
  private int height;
.....

vengono definiti gli oggetti necessari cio\xE8:
  • le immagini contenenti lo sfondo ed il disegno vero e proprio
  • l'oggetto grafico, Graohics2D, necessario a disegnare sulle due immagini interne generate
  • e dimensioni delle due immagini

Il passo fondamentale \xE8 ora l'inizializzazione delle variabili private che costituiscono l'oggetto con il constructor relativo

...
  public DoubleBuffering(int l,int h) 
  {
    width=l;
    height=h;
    initialiseBufferedImage(); 
  }
.... 

Inizializzazione e metodo " paint "

L'inizializzazione viene fatta dal metodo initialiseBufferedImage() che crea le BufferedImage e le Graphics2D e disegna un piccolo ovale blu per identificare lo sfondo

....
  private void initialiseBufferedImage() 
  { 
    theImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 
    g2dImage = theImage.createGraphics(); 
    g2dImage.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
    clearWindow(g2dImage); 
    theBackground = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 
    g2dBackground = theBackground.createGraphics(); 
    g2dBackground.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
    clearWindow(g2dBackground); 
    g2dBackground.setPaint(Color.blue); 
    g2dBackground.fillOval(5, 10, 10, 10); 
  } 
...

non resta che l'override del metodo paint() che non fa altro che fare il draw dell'immagine sull'oggetto grafico

....
  public void paint(Graphics g) 
  { 
    Graphics2D g2d = (Graphics2D) g; 
    // Draw The buffered Image to the screen
    g2d.drawImage(theImage,0,0,null);     
  }  
...

Accessors agli oggetti Graphics2d e BufferedImage

Da ultimo sono necessari alcuni metodi per accedere a quegli oggetti necessari perch\xE9 il disegno possa essere preparato al di fuori del metodo paint il quale si occupa di disegnare sul device grafico l'immagine generata "offscreen"
  //
  //   Method to get the Graphics2d objct TO DRAW on the theImage
  //
    public Graphics2D getG2D()
  {
      return (g2dImage);
  }
  //
  //   Method to get the BufferedImage theBackground objct 
  //
    public BufferedImage getBackGImage()
  {
      return (theBackground);
  }

Fine Pagina

-- RobertoBernetti - 03 May 2014
Topic revision: r1 - 22 Feb 2017, UnknownUser
This site is powered by FoswikiCreative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License1999-2025
Ideas, requests, problems regarding this site? Send feedback