【问题标题】:Blackberry JDE FieldChangeListener黑莓 JDE FieldChangeListener
【发布时间】:2009-09-16 16:09:08
【问题描述】:

我对如何在 Blackberry JDE 中实现 FieldChangeListener 感到有些困惑。一种方法是让我的主类实现 FieldChangeListener,然后在其中有一个 fieldchanged 方法,另一种方法让我这样做:

    FieldChangeListener listenerUS = new FieldChangeListener() {
public void fieldChanged(Field field, int context) {
System.out.println("Something changed!");
pushScreen(_newScreen);
}
};

无论哪种方式,如果我尝试调用一个方法(如 pushScreen 或我编写的自定义方法),我会收到运行时错误。在调试模式下,也没有显示我的任何打印语句。但是,如果我彻底删除 fieldChanged 方法,它甚至不会编译,所以我很漂亮确定它看到了代码?

我已将侦听器添加到我希望它连接到的按钮中,方法是:

            but_temp.setChangeListener(this);

(在第一种情况下)或通过将 listenerUS.

一切似乎都已连接,但我的打印语句出现了,如果我调用一个方法,我会得到一个运行时错误。

这有意义吗?我只是对如何在黑莓上使用监听器感到完全困惑吗?

http://pastie.org/618950

我的代码有一个完整的副本...

【问题讨论】:

  • 我对正在发生的事情感到困惑。你说 println() 调用没有发生,但同时你说 pushScreen() 会导致运行时错误?另外,什么是运行时错误?
  • 之前,当我写这篇文章时,它是一个“JUM 错误 104:未捕获的 NullPointer 异常”。现在它只是在 Eclipse 中崩溃到调试屏幕,即使代码我没有改变。此外,由于某种原因,它现在进入了我的打印声明。

标签: java blackberry listener jde


【解决方案1】:

我查看了您的代码,并没有发现明显的错误。但是,我不会指定主应用程序类作为 FieldChangeListener 的职责。这不是它应该意识到的事情。我能为您做的最好的事情是提供一个示例应用程序,它为 ButtonField 实现 FieldChangeListener 接口。这不是一个解决方案,但也许通过您对代码的更好了解,您将能够挑选出与此示例不同的东西。希望对您有所帮助。

import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.FieldChangeListener;

/**
 * Test implementation of ButtonField.
 */
public class TestAppMain extends UiApplication 
{
    /**
     * Default Constructor.
     */
    private TestAppMain() {        
        pushScreen(new AppScreen());
    }

    /**
     * App entry point.
     * @param args Arguments.
     */
    public static void main(String[] args) {
        TestAppMain app = new TestAppMain();
        app.enterEventDispatcher();
    }

    /**
     * Main application screen.
     */
    private static class AppScreen extends MainScreen 
    {
        /**
         * Default constructor.
         */
        public AppScreen() {
            LabelField title = new LabelField("Button Test Demo",
                    LabelField.ELLIPSIS | LabelField.USE_ALL_WIDTH);
            setTitle(title);

            // Create a button with a field change listener.
            FieldChangeListener listener = new FieldChangeListener() {
                public void fieldChanged(Field field, int context) {
                    ButtonField buttonField = (ButtonField) field;
                    System.out.println("Button pressed: " + buttonField.getLabel());
                }
            };
            ButtonField buttonField = new ButtonField("Test Button", ButtonField.CONSUME_CLICK);            
            buttonField.setChangeListener(listener);
            add(buttonField);
        }               

        /**
         * Handle app closing.
         */
        public void close() {
            Dialog.alert("Goodbye!");
            System.exit(0);
            super.close();
        }
    }
}

【讨论】:

  • 点头 是的,那是我做的另一种方式。然而,我真的很困惑屏幕本身有多少,而不是主代码中的方法。 BB 提供的许多教程使屏幕大部分空白。不过,在屏幕上做事确实很有意义。
【解决方案2】:

我同意 Fostah(+1),通常在 Field、Manager 或 Screen 中实现 FieldChangeListener,或者使用独立的 FieldChangeListener。
此外,从 Field 推/拉屏幕:

UiApplication.getUiApplication().pushScreen(nextScreen);

How to navigate back to the previous screen in the Blackberry emulator?

【讨论】:

  • Hrrm...尝试这样做会使我的打印语句成功打印(万岁!),但程序崩溃得更厉害。之前,它进入那个带有“JUM 错误 104:未捕获的 NullPointer 异常”的白色错误屏幕,但实际上没有什么能把我踢出去(我可以点击“继续”并继续运行我的程序。但是现在,它把我踢进eclipse 中的调试透视图。如果我撤消代码更改以使其恢复原状,它仍然会这样做,这让我感到困惑。
  • 在侦听器中调用任何方法也会将其崩溃到“Screen.class”的调试屏幕。我想我会重构我的所有代码,让工作在我的 providerScreen 类中首当其冲,然后看看会发生什么。
  • 当您找到原因和解决方案时,很高兴有您的回答。
  • sigh 我可以让监听器在一个新类中正常工作,除了按钮和监听器之外没有其他代码。但是,如果我在原始课程中将所有内容都注释掉,但只有一个测试按钮和侦听器,它仍然会崩溃。太混乱了。
  • 嗯。因此,我尝试重构一些东西,并注意到工作的核心在 Fostah 给出的示例中的 Screen 类中。但是,如果我尝试模拟这一点,我的代码在启动时崩溃,没有任何进展,说明 Connection 有问题。你能不从屏幕上做 HTTPConnections 吗?
【解决方案3】:

我非常困惑,但我设法解决了问题。我从头开始创建了一个新类,然后将我的旧代码复制并粘贴到其中。一切正常。我唯一改变的是只导入 Eclipse 说是必要的类(在我有来自各种教程等的一些导入语句之前,所以有些可能没有被使用。)

是否有可能我正在导入导致崩溃的东西?

我真的希望我的大部分代码都在屏幕本身中,但是在我加载之前尝试这样做会使整个事情崩溃。我正在使用的 xml 解析器有些不高兴。

http://pastie.org/621932

有修改后的代码。我真的很沮丧,因为我知道我对这个框架有一些内在的理解,我没有摸索,而且我的大部分麻烦都来自于此。我想只有练习才能帮助我,虽然^_^;;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多