在J2ME中锁定graphice对象

时间:2012-06-28 11:49:51

标签: java java-me lwuit drawimage

这似乎是一个非常愚蠢的问题,但我真的需要一个帮助,我正在制作一个任务,绘制一个背景透明渐变图像,然后在上面绘制一些对象,问题是我想要绘制这个图像一次但其他对象将被多次绘制以执行一些动画

代码如下,这是我想要运行一次的代码,我创建了一个boolen变量= false然后将其设置为true

public void drawLockLayer(Graphics g) {
        try {
            lock = Image.createImage(Paths.lock);
            g.drawImage(lock, 0, 0, LGBMainMidlet.width, LGBMainMidlet.height);
            System.out.println("After Draw Image");
            drawOnce = true;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

其他代码如下

public void paint(Graphics g, Rectangle rect) {

        synchronized (g) {
            if (drawOnce == false) {
                drawLockLayer(g);
            }
        }
        pos = (int) ((System.currentTimeMillis() % 2700) / 300);

        int i = 0;

        g.setColor(bgColor);
        g.fillRoundRect(startX, startY, width, height, 20, 20);


        g.setColor(fgColor);
        g.setFont(font);
        g.drawString(loadMsg, startX + (spacing / 4), startY + (spacing / 4));

        for (int y = 0; y < 3; y++) {
            for (int x = 0; x < 3; x++) {
                int thickness = 6;
                if (i == pos) {
                    thickness = 14;
                } else if (i == pos - 1) {
                    thickness = 10;
                }
                g.fillRect((startX + x * spacing - (thickness / 2)) + (width / 3), (startY + y * spacing - (thickness / 2)) + (height / 3), thickness, thickness);
                i++;
            }
        }


    }

它是输入方法,但它不是绘制背景图像,我想要做的是锁定图形对象,直到他完成绘制图像,然后继续其他代码

任何人都可以帮忙吗

2 个答案:

答案 0 :(得分:2)

代码有几个问题:

  • 同步图形通常是一个坏主意
  • paint应该只从一个线程调用。你确定它不是,你实际上需要同步? rect来自哪里?
  • 为了使维护更容易,您应该在paint()
  • 中将drawOnce设置为true

答案 1 :(得分:-1)

在调用paint之前,您需要将drawOnce设置为false。

看起来您的代码基于GameCanvas。您如何看待以下方法?


    class MainCanvas extends GameCanvas {

    // rect is an attribute

    private void updateScreen() {
        drawOnce = false;
        paint(getGraphics(), rect);
    }

    public void start() {
        new DataThread().start();
        new AnimationThread().start();
    }

    class DataThread extends Thread {
        public void run() {
            while (/*IO stuff not done*/) {
                // save data
                updateScreen();
            }
        }
    }

    class AnimationThread extends Thread {
        public void run() {
            while (/*IO stuff not done*/) {
                // sleep a little
                updateScreen();
            }
        }
    }

    // drawLockLayer and paint(Graphics, Rectangle) methods

    } // end of MainCanvas class