我已经创建了一个ButtonField和一个BitmapField之类的。



  public class MyCanvas extends MainScreen implements FieldChangeListener
  {
    HorizontalFieldManager hfm;
    private Bitmap startBitmap;
    private BitmapField startBitmapField;
    private ButtonField okButton;

   MyCanvas()
   {
     hfm = new HorizontalFIeldManager();
     startBitmap = Bitmap.getBitmapResource("start.png");
     startBitmapField = new BitmapField(startBitmap);
     startBitmapField.setChangeListener(this);
     hfm.add(startBitmapField);

     okButton = new ButtonField("Ok", ButtonField.CONSUME_CLICK | ButtonField.NEVER_DIRTY);
     okButton.setChangeListener(this);
     hfm.add(okButton);
   }

   public void fieldChanged(Field field, int context)
   {
    if(field == startBitmapField)
    {
        System.out.println("Touched START...");
    }
    else if(field == okButton)
    {
        System.out.println("Touched Ok...");
    }
   }
}


但是在Blackberry 4.7仿真器中没有发生ButtonField或BitmapField单击。

我想为Blackberry Storm构建它,所以我正在使用Blackberry 4.7

如何处理Blackberry Storm的ButtonField和BitmapField的单击/触摸事件?



我在创建ButtonField和BitmapFields为

okButtonField = new ButtonField("Ok", BitmapField.HIGHLIGHT_SELECT | BitmapField.FOCUSABLE);

startBitmapField = new BitmapField(startBitmap, BitmapField.HIGHLIGHT_SELECT | BitmapField.FOCUSABLE);


它与..

protected boolean touchEvent(TouchEvent event)
{
  switch( event.getEvent()  )
  {
    case TouchEvent.DOWN:  ........
            return true;
    case TouchEvent.MOVE: .......
                            return true;
    case TouchEvent.UP: ........
                            return true;

    case TouchEvent.CLICK:
      if(deleteButton.isFocus())
      {
        System.out.println("Touched DEL ..........");
      }
      else if(okButton.isFocus())
      {
        System.out.println("Touched OK ..........");
      }
      else if(startBitmapField.isFocus())
      {
        System.out.println("Touched START ..........");
      }
    return true;
  }
  return false;
 }


但每次调用具有焦点的相同按钮时。

表示如果“确定”按钮具有焦点,那么即使您单击“删除”按钮,也会调用“确定”按钮。

那么如何改变对按钮点击的关注呢?意味着无论单击哪个ButtonField或BitmapField,都应该获得焦点?

有什么方法可以检查“ button.isClicked(),例如button.isFocus()”吗?

最佳答案

首先,不要忘记在屏幕上添加hfm;)
实际上,单击按钮可以正常工作。
现在,要使位图单击也起作用,请为BitmapField实现受保护的布尔型touchEvent(TouchEvent消息)。创建扩展类会更好:

class MyCanvas extends MainScreen implements FieldChangeListener {
    HorizontalFieldManager hfm;
    private Bitmap startBitmap;
    private BitmapField startBitmapField;
    private ButtonField okButton;
    private ButtonField cancelButton;

    MyCanvas() {
        hfm = new HorizontalFieldManager();
        add(hfm);

        startBitmap = Bitmap.getBitmapResource("start.png");
        startBitmapField = new TouchBitmapField(startBitmap);
        startBitmapField.setChangeListener(this);
        hfm.add(startBitmapField);

        okButton = new ButtonField("Ok", ButtonField.CONSUME_CLICK
                | ButtonField.NEVER_DIRTY);
        okButton.setChangeListener(this);
        hfm.add(okButton);

        cancelButton = new ButtonField("Cancel", ButtonField.CONSUME_CLICK
                | ButtonField.NEVER_DIRTY);
        cancelButton.setChangeListener(this);
        hfm.add(cancelButton);
    }

    public void fieldChanged(Field field, int context) {
        if (field == startBitmapField) {
            System.out.println("Touched START...");
        } else if (field == okButton) {
            System.out.println("Touched Ok...");
        } else if (field == cancelButton) {
            System.out.println("Touched Cancel...");
        }
    }
}

class TouchBitmapField extends BitmapField {
    public TouchBitmapField(Bitmap startBitmap) {
        super(startBitmap);
    }

    protected boolean touchEvent(TouchEvent message) {
        if (TouchEvent.CLICK == message.getEvent()) {
            FieldChangeListener listener = getChangeListener();
            if (null != listener)
                listener.fieldChanged(this, 1);
        }
        return super.touchEvent(message);
    }
}

08-17 21:02