Java me getHeight()的奇怪行为

Java me getHeight()的奇怪行为,java-me,midlet,java-canvas,Java Me,Midlet,Java Canvas,我正在创建一个J2ME游戏,我注意到getHeight()函数的奇怪行为 它并没有给出以像素为单位的全屏高度,而是返回的值似乎小于这个值 我的代码: Gamecanvas.java: package game1; import java.io.IOException; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.game.GameCanvas; public class Gamecanva

我正在创建一个J2ME游戏,我注意到getHeight()函数的奇怪行为

它并没有给出以像素为单位的全屏高度,而是返回的值似乎小于这个值

我的代码:

Gamecanvas.java:

package game1;

import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Gamecanvas extends GameCanvas implements Runnable{

    private int W=getWidth(),H=getHeight();

    public Gamecanvas(){    
    super(false);
    }
//First called by the Midlet
    public void start(){
        setFullScreenMode(true);


        Thread thread=new Thread(this);
        thread.start();
    }

    public void run() {

        System.out.println("Running Thread!");
        Graphics(getGraphics());

    }

    private void Graphics(Graphics g) {
        Colours(g);

    }

    private void Colours(Graphics g) {
        int w=getWidth(),h=getHeight();

        System.out.println("Correct height="+h);
            System.out.println("Wrong Height="+H);

        g.setColor(0xFFFF00);
        g.fillRect(0, 0, w, h);
        //If i write g.fillRect(0,0,W,H); the screen is not fully filled

        flushGraphics();
    }


}
放置int h=getHeight()时;在方法内部,它返回309,这是正确的,并且 放置int H=getHeight()时;在外部方法中,它返回291,这是错误的

getWidth没有问题。w和w都返回240


那么,是什么导致了getHeight()的这种异常行为呢?

在调用构造函数之前调用
getHeight()
(或任何函数)通常是个坏主意。 只有当构造函数被调用时,对象才会被实例化

在调用构造函数之前调用
getHeight()
,从而得到值291,我猜这是非全屏模式下的可用高度。 然后调用构造函数,在该构造函数中设置fullscreenmode(true),然后值变为309

还有一些需要注意的事情:实际上,在构造函数中调用
setFullScreenMode(true)
也是个坏主意(至少有些人认为是这样),因为对象还没有创建。最佳做法是在
run()
方法中调用它。如果您在构造函数内部调用它,它仍将在某些设备上运行,但某些设备可能会对此抱怨。 这似乎只适用于JavaME,因为当你看Android开发时,你会发现很多情况下你实际上被迫以完全相反的方式编写代码。。。也就是说,在构造函数中对对象调用函数。算了吧

无论如何,要记住的另一件事是
getHeight()
将返回可用像素的数量。仅仅因为手机的分辨率为240x320像素,并不意味着你就可以使用320像素。有些设备“窃取”了一些我们并不真正想要的像素,但我们对此无能为力

编辑: 关于“不要在其构造函数内的对象上调用函数”:早在j2meforums.org存在时,它就被讨论了很多。许多开发人员在让setFullScreenMode(true)工作时遇到问题,因为他们在构造函数内部调用了它。当你考虑它的时候,它是有意义的。您不能对尚不存在的对象调用函数,而且在调用构造函数之前该对象也不存在。 (这就是为什么一些J2ME开发人员对Android开发感到困惑的原因,因为在Android开发中,您实际上被迫在自己的构造函数中调用各种对象上的函数。来自J2ME,这种方式需要一点习惯)