未捕获的异常错误:Blackberry 7 Dev

时间:2014-03-17 09:13:29

标签: blackberry java-me blackberry-simulator

我不明白我做错了什么,代码似乎没问题,我正在尝试为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);
    }
    }

谢谢。

2 个答案:

答案 0 :(得分:1)

您的错误可能与需要位于非滚动管理器中的GridFieldmanager有关。因此,您将获得运行时异常,无法记住它是什么,但很可能是IllegalStateException。

我过去曾试图使用GridFieldManager,说实话,我已经放弃了,因为这样的问题。

正如我在其他问题中所建议的那样:

blackberry-development-ui

我会停止使用GridFieldManager并使用TableLayoutManager。您可以执行相同的操作,如果您对TableLayoutManager有任何问题,您可以获得代码并进行修复。

如果你真的想使用GridFieldManager,那么找一个有用的例子,准确地复制那段代码,然后一次改变它,直到你得到它想要的状态。

另一种可能性是代码无法找到背景图像,在这种情况下,您在paint()方法中获得NullPointerException。因为你的问题描述不是很好,我们分不清楚。要检查这一点,只需查看此语句的结果:

final Bitmap background = Bitmap.getBitmapResource("bg.png");

将位图背景设置为null或不。如果它不为null,则表示正在找到图像。如果它为null,那么我们需要寻找另一个解决方案。

最后,我是否可以建议您尽可能少地使用paint()进行处理。在VerticalFieldManager的paint()方法中,实际上每次都会缩放位图。现在paint()被调用很多,缩放是一个昂贵的操作,所以我建议你重做这段代码,这样你只需缩放一个Bitmap。

抱歉还有一件事 - 您可能需要注意图像缩放。您正在缩放图像以匹配屏幕的大小 - 如果该屏幕是横向还是纵向,该怎么办?图像会变形吗?

<强>更新

我刚刚用这段代码注意了其他几件事:

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)e.printStackTrace();不会产生堆栈跟踪,事实上在这种情况下我怀疑它会做任何事情,除了掩盖问题。在BB java中获取堆栈跟踪的唯一方法是捕获Throwable。您可能想要使用的代码如下:

    try {
....
    } catch (Throwable t) {
        t.printStackTrace();
    }

答案 1 :(得分:0)

使用try catch blocks

尝试{
//你的背景代码

}

catch(例外e){

}