我正在创建一个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();在inside方法中,它返回309,这是正确的 放置int H = getHeight();外部方法它返回291这是错误的
getWidth没有问题.W和W都返回240。
那么,是什么导致了getHeight()的这种异常行为?
答案 0 :(得分:1)
在调用构造函数之前调用getHeight()
(或任何函数)通常是个坏主意。
只有在调用构造函数时,才会实例化对象。
在调用构造函数之前调用getHeight()
,因此得到值291,我猜测它是非全屏模式下的可用高度。
然后调用构造函数,在其中setFullScreenMode(true)
,然后值变为309。
其他一些注意事项:在构造函数中调用setFullScreenMode(true)
实际上也是一个坏主意(至少根据一些人的说法),因为尚未创建对象。最佳做法是在run()
方法中调用它。如果你在构造函数中调用它,它仍会在某些设备上运行,但有些设备可能会抱怨它。
这似乎只适用于JavaME,因为当你看到Android开发时,你会发现许多情况,你实际上被迫以完全相反的方式编码...意思是,在构造函数中调用对象上的函数。去图。
无论如何,要记住的另一件事是getHeight()
将返回可用像素的数量。仅仅因为手机的分辨率为240x320像素,并不意味着你可以使用320像素。有些设备会“窃取”某些像素,以寻找我们并不想要的愚蠢内容,但我们对此无能为力。
编辑: 关于“不要在其构造函数中调用对象上的函数”:j2meforums.org在它存在时对它进行了很多讨论。很多开发人员在设置setFullScreenMode(true)时遇到了问题,因为他们在构造函数中调用了它。当你想到它时,它是有道理的。您不能在尚不存在的对象上调用函数,并且在调用构造函数之前它不存在。 (这就是为什么一些J2ME开发人员对Android开发感到困惑的原因,因为在Android开发中你实际上被迫在他们自己的构造函数中的各种对象上调用函数。来自J2ME,这种做事方式需要一点时间习惯)。