доступ к внутреннему классу при создании BitmapField и добавление его в HorizontalFieldManager - PullRequest
1 голос
/ 26 августа 2009

Я создаю внутренний класс в методе. После этого я обращаюсь к некоторым высказываниям вроде

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 (означает в той же позиции, заменяя предыдущую)». Но я хочу, чтобы битовые поля находились рядом друг с другом в hfm.

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

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

1 Ответ

1 голос
/ 27 августа 2009

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

  • не вижу смысла использовать синхронизированный, поскольку это поток пользовательского интерфейса
  • не setBitmap, растровое изображение уже передано конструктору BitmapField
  • на самом деле все битовые поля идут рядом друг с другом в 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]);
        }
    }
    }
    
...