доступ к внутреннему классу при создании BitmapField и добавлении его в 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++;

Но здесь проблема в том, что после создания растрового изображения и перед созданием bitmapField управление переходит к

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

Поэтому перед созданием bitmapField он добавляет его в hfm.

Таким образом, вывод выглядит следующим образом: «Каждый раз, когда в hfm добавляется новый BitmapField (означает, что в той же позиции заменяется предыдущий)». Но я хочу, чтобы BitmapFields располагались рядом друг с другом в hfm.

Как это сделать?

Любое решение, почему элемент управления сначала переходит к hfm.add() перед новым внутренним классом bitmapField()?


person Shreyas    schedule 26.08.2009    source источник
comment
Ваш стиль кодирования здесь кажется неровным, и, похоже, отсутствуют некоторые закрывающие скобки. Это немного затрудняет понимание того, что вы пытаетесь сделать здесь. Например, куда вписывается второй фрагмент кода? Это конец drawBitmap()?   -  person Richard    schedule 26.08.2009
comment
Проблема замены (замена на той же позиции заменой предыдущей) теперь решена. Но новая проблема заключается в том, что последний рисунок добавляется путем замены предыдущего. Означает, что если вы рисуете в первый раз, то он правильно отображается в bitmapField. если вы рисуете во второй раз, то 2 раза 2-й рисунок добавляется в bitmapField, заменяя предыдущий. paint() вызывается 2 раза, чтобы нарисовать 2 рисунка. Как решить эту проблему?   -  person Shreyas    schedule 27.08.2009


Ответы (1)


прежде всего, несколько предложений по коду:

  • не вижу причин использовать синхронизированный, так как это поток пользовательского интерфейса
  • не устанавливайте битмап, растровое изображение уже передано в конструктор BitmapField
  • на самом деле все BitmapFields идут рядом друг с другом в hfm, чтобы было понятно, я добавляю номер к каждому.
  • если вам нужен пользовательский конструктор или новые поля в BitmapField, лучше создать новый класс как расширение 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]);
        }
    }
    }
    
person Maksym Gontar    schedule 27.08.2009
comment
Привет, coldice, прежде всего большое спасибо за ответ. Теперь это идет рядом друг с другом. См. также мой ответ. Я пробовал это в течение 3 дней. Большое спасибо...... - person Shreyas; 27.08.2009