黑莓JDE FieldChangeListener

时间:2009-09-16 16:09:08

标签: java blackberry listener jde

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

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

3 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

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

UiApplication.getUiApplication().pushScreen(nextScreen);

请参阅How to navigate back to the previous screen in the Blackberry emulator?

答案 2 :(得分:0)

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

我是否有可能导入导致事故崩溃的内容?

我真的宁愿把我的大部分代码放在屏幕本身,但尝试在我甚至加载之前崩溃整个事情。关于我正在使用的xml解析器的一些不满意。

http://pastie.org/621932

有修改后的代码。我真的很沮丧,因为我知道这个框架工作有一些固有的理解,我不是很喜欢,而且我的大部分麻烦都来自于此。我想只有练习会帮助我,尽管^ _ ^ ;;