我不明白这是什么,我做错了,代码似乎是对的,我试图设置一个GridLayout的背景图像,当我添加背景代码,我得到一个错误,当我注释出来,它在模拟器中运行良好。我做错了什么?
public class GFMScreen extends MainScreen {
VerticalFieldManager ver;
ButtonField submit;
HorizontalFieldManager hr;
private int phoneWidth = Display.getWidth();
private int cellHeight = Display.getHeight();
public GFMScreen() {
super(Manager.USE_ALL_WIDTH | Manager.NO_VERTICAL_SCROLL);
setTitle("Jonezing");
createGUI();
}
public void createGUI() {
try {
final Bitmap background = Bitmap.getBitmapResource("bg.png");
ver = new VerticalFieldManager(Manager.NO_HORIZONTAL_SCROLL
| VerticalFieldManager.NO_VERTICAL_SCROLL
| Manager.FIELD_VCENTER | USE_ALL_HEIGHT | USE_ALL_WIDTH) {
public void paint(Graphics g) {
Bitmap scaled = new Bitmap(phoneWidth, cellHeight);
background.scaleInto(scaled, Bitmap.SCALE_TO_FIT);
g.drawBitmap(0, 0, phoneWidth, cellHeight, scaled, 0, 0);
super.paint(g);
}
};
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// ver.setBackground(BackgroundFactory.createBitmapBackground(Bitmap
// .getBitmapResource("bg.png")));
ver = new VerticalFieldManager(Manager.NO_HORIZONTAL_SCROLL
| VerticalFieldManager.NO_VERTICAL_SCROLL
| Manager.FIELD_VCENTER | USE_ALL_HEIGHT | USE_ALL_WIDTH);
GridFieldManager grid = new GridFieldManager(4, 2,
Manager.FIELD_VCENTER | Manager.NO_VERTICAL_SCROLL);
grid.add(new BitmapField(Bitmap.getBitmapResource("english.png")));
grid.add(new BitmapField(Bitmap.getBitmapResource("yoruba.png")));
grid.add(new LabelField("English", Field.FOCUSABLE));
grid.add(new LabelField("Yoruba", Field.FOCUSABLE));
grid.add(new BitmapField(Bitmap.getBitmapResource("mp.png")));
grid.add(new BitmapField(Bitmap.getBitmapResource("about.png")));
grid.add(new LabelField("MP3s", Field.FOCUSABLE));
grid.add(new LabelField("About", Field.FOCUSABLE));
grid.setPadding(100, 0, 50, 100);
grid.setColumnPadding(100);
grid.setRowPadding(10);
ver.add(grid);
add(ver);
}
}
谢谢。
您的错误可能与GridFieldmanager要求在非滚动管理器中有关。你会得到一个运行时异常,不记得是什么了,但很可能是一个IllegalStateException。
我曾经尝试过使用GridFieldManager在过去,诚实地说,我已经放弃了它,因为这样的问题。
正如我在你的另一个问题中所建议的:
blackberry-development-ui
我会停止使用GridFieldManager和使用TableLayoutManager代替。你可以做同样的事情如果你有任何关于TableLayoutManager的问题,你有代码并且可以修复它。
如果你真的想使用GridFieldManager,然后找到一个使用它的例子,准确地复制代码,并一次更改它,直到你得到你想要的状态。
另一种可能性是代码找不到背景图像,在这种情况下,您将在paint()方法中获得NullPointerException。因为你的问题描述得不是很好,我们无法判断。要检查这一点,只需查看以下语句的结果:
final Bitmap background = Bitmap.getBitmapResource("bg.png");
将位图背景设置为null或否。如果它不是空的,那么图像正在被找到。如果它为空,那么我们需要寻找另一个解析。
最后,我建议您在paint()中尽可能少地进行处理。在你的VerticalFieldManager的paint()方法中,你实际上每次都缩放Bitmap。现在paint()被调用了很多次,缩放是一个昂贵的操作,所以我建议你重做这段代码,这样你只缩放一个位图。
对不起,还有一件事-你可能需要小心图像缩放。您正在缩放图像以匹配屏幕的大小-如果屏幕是横向或纵向的呢?图像会变形吗?
我刚刚注意到这段代码的其他一些东西:
try {
final Bitmap background = Bitmap.getBitmapResource("bg.png");
ver = new VerticalFieldManager(Manager.NO_HORIZONTAL_SCROLL
| VerticalFieldManager.NO_VERTICAL_SCROLL
| Manager.FIELD_VCENTER | USE_ALL_HEIGHT | USE_ALL_WIDTH) {
public void paint(Graphics g) {
Bitmap scaled = new Bitmap(phoneWidth, cellHeight);
background.scaleInto(scaled, Bitmap.SCALE_TO_FIT);
g.drawBitmap(0, 0, phoneWidth, cellHeight, scaled, 0, 0);
super.paint(g);
}
};
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
1)在这段代码中,try/catch只捕获位图和VFM创建中的错误。它不会捕获paint()方法中的任何错误。我非常怀疑您在位图或VFM
的构造中得到错误。2) . printstacktrace ();不会产生堆栈跟踪,事实上,在这种情况下,我怀疑它会做任何事情,除了掩盖一个问题。在BB java中获得堆栈跟踪的唯一方法是捕获Throwable。您可能想使用的代码是这样的:
try {
....
} catch (Throwable t) {
t.printStackTrace();
}
使用try catch块
尝试{
//你的后台代码在这里
}
抓住(异常e) {
}