黑莓UI提示框

时间:2012-02-03 16:25:51

标签: blackberry blackberry-jde

我对黑莓UI开发非常陌生,想知道有没有办法在位图上添加提示框?就像HTML元素中的title属性一样

1 个答案:

答案 0 :(得分:2)

您可以使用以下TooltipScreen并按以下方式向屏幕添加字段

add(new ButtonField(“myButton”), “My Tooltip text”);

TooltipScreen

import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.container.MainScreen;

public class TooltipScreen extends MainScreen {

TooltipScreen screen = this;
boolean doRedraw = false;//prevent infinte redrawing
Vector tooltips = new Vector();//vector to hold tooltip strings
private Timer tooltipTimer = new Timer();
private TimerTask tooltipTask;
boolean alive = false;//is the tooltip alive? used to pop it after our timeout
int count = 0;//used to calculate time tooltip is displayed
//tooltip popup colours:
int backgroundColour = 0xeeeeee;
int borderColour = 0xaaaaaa;
int fontColour = 0x666666;
//the tooltip:
String tooltip;
int tooltipWidth;
int yCoord;
int xCoord;
//region parameters:
XYRect contentArea;
int contentBottom;
int contentRight;

public TooltipScreen() {
    super();

    //when timeout reaches 100ms*20 ie. 2seconds set alive to false and redraw screen:
    tooltipTask = new TimerTask() {

        public void run() {
            if (alive) {
                count++;
                if (count == 20) {
                    alive = false;
                    invalidate();
                }
            }
        }
    };

    tooltipTimer.scheduleAtFixedRate(tooltipTask, 100, 100);

}

//override add method adds an empty string to tooltip vector:
public void add(Field field) {
    tooltips.addElement("");
    super.add(field);
}

//custom add method for fields with tooltip: add(myField, "myTooltip");
public void add(Field field, String tooltip) {
    super.add(field);
    tooltips.addElement(tooltip);
}

public void setColours(int backgroundColour, int borderColour, int fontColour) {
    this.backgroundColour = backgroundColour;
    this.borderColour = borderColour;
    this.fontColour = fontColour;
}

//reset everything when user changes focus,
//possibly needs logic to check field has actually changed (for listfields, objectchoicefields etc etc)
protected boolean navigationMovement(int dx, int dy, int status, int time) {
    count = 0;
    alive = true;
    doRedraw = true;
    return super.navigationMovement(dx, dy, status, time);
}

protected void paint(Graphics graphics) {
    super.paint(graphics);
    if (alive) {
        Field focusField = getFieldWithFocus();
        tooltip = (String) tooltips.elementAt(screen.getFieldWithFocusIndex());

        //don't do anything outside the norm unless this field has a tooltip:
        if (!tooltip.equals("")) {
            //get the field content region, this may fall inside the field actual region/coordinates:
            contentArea = focusField.getContentRect();
            contentBottom = contentArea.y + contentArea.height;
            contentRight = contentArea.x + contentArea.width;

            //+4 to accomodate 2 pixel padding on either side:
            tooltipWidth = graphics.getFont().getAdvance(tooltip) + 4;

            yCoord = contentBottom - focusField.getManager().getVerticalScroll();
            //check the tooltip is being drawn fully inside the screen height:
            if (yCoord > (getHeight() - 30)) {
                yCoord = getHeight() - 30;
            }

            //check the tooltip doesn't get drawn off the right side of the screen:
            if (contentRight + tooltipWidth < getWidth()) {
                xCoord = contentRight;
            } else {
                xCoord = getWidth() - tooltipWidth;
            }

            //draw the tooltip
            graphics.setColor(backgroundColour);
            graphics.fillRect(xCoord, yCoord, tooltipWidth, 30);
            graphics.setColor(borderColour);
            graphics.drawRect(xCoord, yCoord, tooltipWidth, 30);
            graphics.setColor(fontColour);
            graphics.drawText(tooltip, xCoord + 2, yCoord);
        }
    }
    //doRedraw logic prevents infinite loop
    if (doRedraw) {
        //System.out.println("redrawing screen: " + System.currentTimeMillis());
        screen.invalidate();
        doRedraw = false;
    }
}
}