Newsgroup: it.comp.java
Titolo: (HELP) Problema con la doppia bufferizzazione

Ciao,
    Ho appena creato un APPLET di Pacman ma ho dei problemi a convertirlo
come APPLICAZIONE. Infatti il compilatore non riesce a creare la classe
principale visto che trova un errore nel metodo costruttore, precisamente
nella seconda istruzione che crea l'immagine 'off screen' per il metodo
della doppia bufferizzazione.
 Pacman() {
  super("Pippo");
  img = createImage(getSize().width, getSize().height);
  gout = img.getGraphics(); <------------------mi da errore qui
  ......
}
Nell' Applet non mi da nessun problema ma qui si. Non e' che in un'
applicazione la doppia bufferizzazione va implementata in modo diverso? Sul
mio manuale purtroppo ho solo un esempio ma di un applet.
Grazie per chi volesse aiutarmi
--
Drac (o Drachetto)
Area 5.1, HT-Group, it.hobby.home-cinema, 
www.ihhc.net
#207 de I FeSTosi, it.fan.scrittori.tolkien, 
www.imladris.immaginario.net

>   img = createImage(getSize().width, getSize().height);
Probabilmente hai scritto queste istruzioni nel costruttore.
Ci sono alcune cose che vengono risolte alla fine.
Ad esempio, se nel costruttore, cerchi prendere il contesto grafico del tuo
Frame, ti torna null, perchè in quel punto ancora non è stato creato.
Un sistema per capire quando hai accesso al contesto grafico è ridefinire il
metodo : [public void addNotify()]
ATTENZIONE !!!!!!! non scordarti di scrivere dentro questo metodo:
[super.addnotify()].
In questo metodo viene creato il peer che, se non ricordo, è quello che da
accesso al driver grafico.
Dopo il super, sei sicuro che il contesto grafico è a tua disposizione e
quindi puoi fare : createImage e finire l'inizializzazione delle tue
variabili.
N.B. non ricordo se il metodo: [annNotify()] può essere richiamato, è buona
cosa cmq. usare un booleano con il quale capire se l'inizializzazione è
stata fatta o meno, se è stata fatta ovviamente è inutile rifarla.
Ciao


Ciao, grazie infinitamente per la risposta! Anche se esauriente non sono
riuscito a capire bene cosa mettere nel metodo 'addNotify' (colpa mia, colpa
mia ;) anche se ho capito che bisogna mettere una variabile booleana che mi
indichi quando posso creare l' img. Non e' che potresti scrivere un piccolo
codice di esempio? Anche sul mio manuale non c'e' nulla su questo
'addNotify'
Grazie ancora

import java.awt.*;
public class Frame1 extends Frame
{
 public Frame1()
 {
  setLayout(null);
  setSize(556,356);
  setVisible(false);
  add(txtResult1);
  txtResult1.setBounds(115,70,340,45);
  add(txtResult2);
  txtResult2.setBounds(115,130,340,45);
  setTitle("A Simple Frame");
  // Questo test serve per farti vedere che dentro il costruttore
  // il contesto grafico ancora non esiste e quindi non puoi
  //  creare immagini.
  Image img = createImage(getSize().width, getSize().height);
  if(img == null)
      txtResult1.setText("Null");
  else
      txtResult1.setText("ok");
  // Non badare a questa parte
  // Per velocizzare ho utilizzato il GUi di VisualCafè, che crea da solo il
codice
  SymWindow aSymWindow = new SymWindow();
  this.addWindowListener(aSymWindow);
 }
 public Frame1(String title)
 {
  this();
  setTitle(title);
 }
    /**
     * Shows or hides the component depending on the boolean flag b.
     * @param b  if true, show the component; otherwise, hide the component.
     * @see java.awt.Component#isVisible
     */
    public void setVisible(boolean b)
     {
      if(b)
      {
       setLocation(50, 50);
      }
      super.setVisible(b);
 }
 static public void main(String args[])
 {
  (new Frame1()).setVisible(true);
 }
 public void addNotify()
 {
     // Record the size of the window prior to calling parents addNotify.
     Dimension d = getSize();
  super.addNotify();
// Questa è la parte che ti dicevo
// Inizio ----------------------------
  if(getGraphics() == null)
      txtResult2.setText("NULL");
  else
      txtResult2.setText("Ok");
  Image img = createImage(getSize().width, getSize().height);
  if(img == null)
      txtResult1.setText(txtResult1.getText()+"   Null");
  else
      txtResult1.setText(txtResult1.getText()+"   ok");
  if (fComponentsAdjusted)
   return;
// Fine-------------------------------
// Tutto il resto è codice autogenerato.
// Dagli uno sguardo, si imparano belle cose.
  // Adjust components according to the insets
  Insets insets = getInsets();
  setSize(insets.left + insets.right + d.width, insets.top + insets.bottom +
d.height);
  Component components[] = getComponents();
  for (int i = 0; i < components.length; i++)
  {
   Point p = components[i].getLocation();
   p.translate(insets.left, insets.top);
   components[i].setLocation(p);
  }
  fComponentsAdjusted = true;
 }
    // Used for addNotify check.
 boolean fComponentsAdjusted = false;
 //{{DECLARE_CONTROLS
 java.awt.TextField txtResult1 = new java.awt.TextField();
 java.awt.TextField txtResult2 = new java.awt.TextField();
 //}}
 //{{DECLARE_MENUS
 //}}
 class SymWindow extends java.awt.event.WindowAdapter
 {
  public void windowClosing(java.awt.event.WindowEvent event)
  {
   Object object = event.getSource();
   if (object == Frame1.this)
    Frame1_WindowClosing(event);
  }
 }
 void Frame1_WindowClosing(java.awt.event.WindowEvent event)
 {
    System.exit(0);
   }
}

 wrote in message
a8h76b$4hvi$2...@stargate1.inet.it...
Grazie ancora infinitamente! Dopo gli do' un occhiata piu' approfondita!
:_)