java - 单击按钮外部区域时激活按钮(Java/Blackberry 应用程序)

标签 java eclipse blackberry blackberry-simulator blackberry-eclipse-plugin

我一直在开发黑莓应用程序,该应用程序最初在屏幕上有两个按钮( btn1btn2 )。现在我添加了第三个,但我遇到了一些困难( btn3 )。

btn1btn2并排,单击按钮外部,但在按钮下方会激活按钮……这是一个设计缺陷,但可以被忽略。

但是,我需要在 btn1 下面添加一个按钮当我这样做时,发生了两件奇怪的事情:首先是,即使我点击 btn3如下btn1 ,焦点转移到btn1btn1叫做。然后点击btn2将焦点转移到btn3并且它被激活。

我不完全确定为什么会发生这种情况,但我正在尝试下面粘贴的代码。任何一点帮助都会受到赞赏。

    btn1 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled_1a.png"), Bitmap.getBitmapResource("button-normal_2.png"));      
    btn2 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled_3.png"), Bitmap.getBitmapResource("button-normal_4.png"));
    btn3 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled5.png"), Bitmap.getBitmapResource("button-normal_6.png"));

    Background bg = BackgroundFactory.createBitmapBackground(Bitmap.getBitmapResource("background.png"));

    HorizontalFieldManager vfm = new HorizontalFieldManager(){
        public int getPreferredHeight() {
            // TODO Auto-generated method stub
            return Display.getHeight();
        }

        public int getPreferredWidth() {
            // TODO Auto-generated method stub
            return Display.getWidth();
        }

        protected void sublayout(int maxWidth, int maxHeight) {
            // TODO Auto-generated method stub
            int count = getFieldCount();
            for(int i = 0 ; i < count ; i++ ){
                Field f = getField(i);

             if(f == btn1 ){
                 setPositionChild(f, (getPreferredWidth() >> 1) - f.getPreferredWidth(), getPreferredHeight()>>1);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }else if (f == btn2 ){
                    setPositionChild(f, (getPreferredWidth() >> 1) +30, getPreferredHeight()>>1);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }else if (f == lblName ){
                    setPositionChild(f, 30, getPreferredHeight()>>1 - btnLicense.getPreferredHeight());
                    layoutChild(f, ( getPreferredWidth() * 3 ) >> 2, getPreferredHeight());
                }else if (f == btn3 ){

                    setPositionChild(f, (getPreferredWidth() >> 1) - f.getPreferredWidth() -0 ,  getPreferredHeight()- getPreferredHeight()+280);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }

            }
            setExtent(getPreferredWidth(),getPreferredHeight());
        }

        public void subpaint(Graphics graphics){
            int count = getFieldCount();
            for(int i = 0 ; i < count ; i++ ){
                net.rim.device.api.ui.Field f = getField(i);
                paintChild(graphics,f);
            }
        }

    };

自定义按钮字段

package com.app.ui.component;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;

public class CustomButtonField extends Field {

    /** To set background image for button field */
    private Bitmap bkImage;

    /** To set Focus image for button field */
    private Bitmap bkFocusImage;

    /** int value for Field Width */
    private int fieldWidth;

    /** int value for Field Height */
    private int fieldHeight;

    /** Text to write on Button */
    private String text;

    /** Text Color on Button */
    private int textColor = Color.WHITE;

    /** Default Font for Button */
    private Font defaultFont = Font.getDefault();

    /**
     * Constructor with
     * @param text
     * @param image
     * @param focusImage
     */
    public CustomButtonField (String text, Bitmap image, Bitmap focusImage) {   
        this(text, image, focusImage, 0);
    }

    /**
     * Constructor with
     * @param text
     * @param image
     * @param focusImage
     * @param style
     */
    public CustomButtonField(String text, Bitmap image, Bitmap focusImage, long style) {
        super(Field.FOCUSABLE | style);
        this.text = text;
        bkImage = image;
        this.bkFocusImage = focusImage;
        fieldHeight = bkImage.getHeight();
        fieldWidth = bkImage.getWidth();
    }

    /**
     * To get the exact width needed by the field borderWidth - used to show the
     * width of focused rectangle around the button
     */
    public int getPreferredWidth() {
        return fieldWidth;
    }

    /**
     * To get the exact width needed by the field borderHeight - used to show
     * the height of focused rectangle around the button
     */
    public int getPreferredHeight() {
        return fieldHeight;
    }

    protected void layout(int width, int height) {
        setExtent(getPreferredWidth(), getPreferredHeight());
    }

    /**
     * To set the background according to focused state of the field
     */
    protected void drawFocus(Graphics graphics, boolean flag) {
        graphics.setFont(defaultFont);
        if (bkFocusImage != null) {
            graphics.drawBitmap((getPreferredWidth() - bkFocusImage.getWidth()) / 2,(getPreferredHeight() - bkFocusImage.getHeight()) / 2,
                    bkFocusImage.getWidth(), bkFocusImage.getHeight(),bkFocusImage, 0, 0);
        }
        graphics.setColor(Color.WHITE);
        int textWidth = defaultFont.getAdvance(text);
        graphics.drawText(text, (fieldWidth - textWidth) / 2,(fieldHeight - defaultFont.getHeight()) / 2);
    }

    protected void paint(Graphics graphics) {
        graphics.setFont(defaultFont);
        if (bkImage != null) {
            graphics.drawBitmap((getPreferredWidth() - bkImage.getWidth()) / 2,(getPreferredHeight() - bkImage.getHeight()) / 2,
                    bkImage.getWidth(), bkImage.getHeight(), bkImage, 0, 0);
        } 
        graphics.setColor(textColor);
        int color = (isEnabled())?Color.BLACK:Color.DARKGRAY;
        graphics.setColor(color);

        int textWidth = defaultFont.getAdvance(text);
        graphics.drawText(text, (fieldWidth - textWidth) / 2,(fieldHeight - defaultFont.getHeight()) / 2);
    }

    protected boolean navigationClick(int status, int time) {
        fieldChangeNotify(0);
        return true;
    }
}

最佳答案

当您第一次实现自定义 BlackBerry 按钮和字段时,这是一个非常容易遇到的问题。首先,这里的问题是您的 CustomButtonField 类(这是一个从头开始编写的按钮字段)无法正确确定哪些触摸事件(或导航事件)在其范围内(在字段区域内)。

解决此问题的一种方法是修改 navigationClick() 方法,并实现 touchEvent() 方法:

   protected boolean touchEvent( TouchEvent message )    {
      int x = message.getX( 1 );        
      int y = message.getY( 1 );        
      if( x < 0 || y < 0 || x > getExtent().width || y > getExtent().height ) {
         // Outside the field            
         return false;       
      }        

      switch( message.getEvent() ) {                  
      case TouchEvent.UNCLICK:                
         fieldChangeNotify(0);               
         return true;        
      }        
      return super.touchEvent( message );    
   }

   protected boolean navigationClick(int status, int time) {
      if (status != 0) {        // you did not have this check
         fieldChangeNotify(0);
      }
      return true;
   }

我实际上推荐的另一个选择是将整个 CustomButtonField 类替换为 BlackBerry Advanced UI library 中的示例之一。

您可以使用BitmapButtonField ,以及 BaseButtonField它扩展了,通过适当的触摸/点击处理来实现相同的功能。

当您在那里时,请查看该库中的一些其他 UI 类,因为您可能会发现它们非常有用。

关于java - 单击按钮外部区域时激活按钮(Java/Blackberry 应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14415195/

相关文章:

Java面向对象编程: How to design the situation where an attribute value would decide the class of another attribute?

java - Android-由于 java.lang.NullPointerException 无法显示收到的位置值

java - 启用 Jasper Studio Web 服务插件

blackberry - 在 BlackBerry 中下载服务器 SSL 证书

java - 如何修改此示例代码以显示在 BlackBerry 中更新 UI 的三种方法之间的差异

java - jquery.js 没有在 Tomcat 中加载

java - 响应客户端后如何提取有效负载?

java - 如何在 Eclipse 中为新的 JUnit 测试默认源文件夹?

java - 并行测试方法

blackberry - Blackberry 的密码和数字提示 (java)