2009-08-26 6 views
1

Je crée une classe interne dans une méthode. Après que j'accéder à certaines déclarations comme,Accéder à la classe interne lors de la création de BitmapField et l'ajouter dans HorizontalFieldManager

public class Test extends MainScreen 
{ 
    HorizontalFieldManager hfm; 
    Bitmap bitmap[] = new Bitmap[100]; 
    BitmapField[] bitmapField = new BitmapField[100]; 
    int countBitmap = 0; 

    Test() 
    { 
     VerticalFieldManager vfm_Main = new VerticalFieldManager(); 
     hfm = new HorizontalFieldManager(HorizontalFieldManager.USE_ALL_WIDTH); 
     vfm_Main.add(hfm); 
     add(vfm_Main); 
    } 


    void drawBitmap() 
    { 
    bitmap[countBitmap] = new Bitmap(100, 100); 
    bitmapField[countBitmap] = new BitmapField(bitmap[countBitmap]){ 
    public void paint(Graphics g) 
    { 
      ................ 
      ................ 
      g.drawLine(x1,y1,x2,y2); 
     } 
    } 


    synchronized(UiApplication.getEventLock()) 
    { 

     for(int i = 0 ; i < bitmapField.length; i++) 
     { 
     if(bitmapField[i] != null) 
     { 
       bitmapField[i].setBitmap(bitmap[i]); 
     } 
     } 
     hfm.add(bitmapField[countBitmap]); 
     countBitmap++; 

Mais ici le problème après la création du bitmap & avant de créer le bitmapField, le contrôle va à

synchronized(UiApplication.getEventLock()){hfm.add(bitmapField[countBitmap]); } 

Alors avant de créer le bitmapField, il l'ajoute en hfm. Donc, la sortie arrive comme "Chaque fois qu'un nouveau BitmapField est ajouté dans hfm (signifie à la même position en remplaçant le précédent)". Mais je veux que les BitmapFields viennent les uns à côté des autres dans hfm.

Comment le faire?

Toute solution pourquoi le contrôle passe d'abord à hfm.add() avant la nouvelle classe interne bitmapField()?

+0

Votre style de codage semble ici inégale, et il semble y avoir une certaine proximité parenthèse manquante. Cela rend un peu difficile de comprendre ce que vous essayez de faire ici. Par exemple, où se situe la seconde coupée de code? Est-ce la fin de drawBitmap()? – Richard

+0

Le problème de remplacement (remplacement à la même position en remplaçant le précédent) est résolu maintenant. Mais un nouveau problème est que le dessin récent est ajouté en remplaçant le précédent. Signifie que si vous dessinez pour la première fois, il apparaît correctement dans bitmapField. Si vous dessinez pour la deuxième fois, alors 2 fois le 2ème dessin est ajouté dans bitmapField en remplaçant le précédent. Paint() s'appelle 2 fois pour dessiner 2 dessins. Comment résoudre ce problème? – Shreyas

Répondre

1

d'abord, plusieurs suggestions sur le code:

  • voir aucune raison en utilisant synchronisés car il est thread d'interface utilisateur
  • ne pas SetBitmap, bitmap est déjà passé au constructeur BitmapField
  • fait tous BitmapFields venir l'un à côté de l'autre dans hfm, pour être clair, j'ai ajouté un numéro à chacun.
  • si vous voulez certains champs constructeur personnalisé ou nouveaux dans BitmapField, il est préférable de créer une nouvelle classe comme une extension de BitmapField

    class TestScr extends MainScreen { 
    HorizontalFieldManager hfm; 
    Bitmap bitmap[] = new Bitmap[100]; 
    BitmapField[] bitmapField = new BitmapField[100]; 
    
    TestScr() { 
        hfm = new HorizontalFieldManager(); 
        add(hfm); 
        drawBitmap(); 
    } 
    
    void drawBitmap() { 
        for (int i = 0; i < 5; i++) { 
         bitmap[i] = new Bitmap(50, 50); 
    
         Graphics graphics = new Graphics(bitmap[i]); 
         graphics.setColor(Color.RED); 
         String number = Integer.toString(i); 
         Font font = graphics.getFont().derive(Font.BOLD, 40, Ui.UNITS_px); 
         graphics.setFont(font); 
         int textWidth = graphics.getFont().getAdvance(number); 
         int textHeight = graphics.getFont().getHeight(); 
         int x = (bitmap[i].getWidth() - textWidth)/2; 
         int y = (bitmap[i].getHeight() - textHeight)/2; 
         graphics.drawText(number, x, y); 
    
         bitmapField[i] = new BitmapField(bitmap[i]) { 
          public void paint(Graphics g) { 
           super.paint(g); 
           int width = getWidth() - 1; 
           int height = getHeight() - 1; 
           g.setColor(Color.GREEN); 
           g.drawLine(0, 0, width, 0); 
           g.drawLine(width, 0, width, height); 
           g.drawLine(width, height, 0, height); 
           g.drawLine(0, height, 0, 0); 
          } 
         }; 
    
         hfm.add(bitmapField[i]); 
        } 
    } 
    } 
    
+0

Hi coldice, tout d'abord merci beaucoup pour la réponse. Maintenant, il vient l'un à côté de l'autre. Voyez ma réponse aussi. J'essayais cela pendant 3 jours. Merci beaucoup...... – Shreyas

Questions connexes