如何在Blackberry中创建按钮

时间:2014-06-15 09:51:54

标签: blackberry java-me

我正在尝试创建一个按钮,在按下按钮时会显示一条消息,但无法使其生效。

这是我的按钮:

HorizontalFieldManager buttonManager =
    new HorizontalFieldManager(ButtonField.FIELD_HCENTER);

messageButton = new ButtonField("Press me", ButtonField.CONSUME_CLICK);
messageButton.setChangeListener(this);
buttonManager.add(messageButton);
add(buttonManager);

以下是打印消息的方法:

public void fieldChanged(Field field, int context) {
    if (field == messageButton) {
        showMessage();
    } 
}

private void showMessage() {
    Dialog.inform("The button was pressed");
}

我在showMessage()方法中做错了什么,或者在其他地方输入错误?

4 个答案:

答案 0 :(得分:1)

// just paste this class and run 







package mypackage;

import java.io.IOException;

import javax.microedition.media.MediaException;
import javax.microedition.media.Player;

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


public final class MyScreen extends MainScreen
{

    public MyScreen()
    {        
        // Set the displayed title of the screen       


        HorizontalFieldManager horizontalFieldManager= new HorizontalFieldManager();
        ButtonField buttonField= new ButtonField("click to show dialog",Field.FIELD_VCENTER);
        horizontalFieldManager.add(buttonField);
        buttonField.setChangeListener(buttonchangelisners);
        add(horizontalFieldManager);

    }

    private FieldChangeListener buttonchangelisners= new FieldChangeListener() {

        public void fieldChanged(Field field, int context) {
            // TODO Auto-generated method stub

            showDialog("show your message");
        }
    };

     public void showDialog(final String message) {
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                Dialog.alert(message);
            }
        });
    }
}

答案 1 :(得分:0)

检查事件日志(Alt + LGLG),我怀疑你会看到有关在非事件线程上推送模式屏幕的错误。如果是这种情况,只需将showMessage更改为

即可
private void showMessage() 
{
   UiApplication.getUiApplication.invokeLater(new Runnable()
   {
      public void run()
      {
         Dialog.inform("The button was pressed");
      }
   });
}

答案 2 :(得分:0)

我认为问题可能是你传递给构造函数的标志CONSUME_CLICK。如果你想用按钮做某事,那肯定不是你想要使用的标志。

除此之外,我建议不要将FieldChangeListener用于字段。也许对于按钮是可以的,但对于其他组件,可能在布局期间没有用户交互的情况下调用fieldChanged方法。这就是为什么你几乎总想过滤掉那些第二个参数(代码中的上下文)等于FieldChangeListener.PROGRAMMATIC的调用。

更好的选择是覆盖navigationClick,这也适用于触觉和常规屏幕。

答案 3 :(得分:0)

invokeLater仍然有用,因为在UI Engine操作链中的某个点调用了fieldChanged,并且在显示Dialog之前最好让它完成作业。我怀疑不使用invokeLater是问题的主要原因。

使用fieldChangeListener时,实际上需要CONSUME_CLICK,否则将调用上下文菜单。如果切换到在按钮字段中使用navigationClick,则可以返回true以实现相同的行为(尽管我更喜欢使用navigationUnclick)。