1

我对如何在 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

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

4

3 回答 3

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();
        }
    }
}
于 2009-09-16T17:57:24.860 回答
0

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

UiApplication.getUiApplication().pushScreen(nextScreen);

请参阅如何在黑莓模拟器中导航回上一个屏幕?

于 2009-09-17T08:56:41.787 回答
0

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

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

我真的宁愿将我的大部分代码放在屏幕本身,但在我加载之前尝试让整个事情崩溃。我正在使用的 xml 解析器有些不高兴。

http://pastie.org/621932

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

于 2009-09-18T16:12:18.040 回答