2012-02-03 77 views
0

我對黑莓UI開發非常陌生,想知道有沒有什麼方法可以在位圖上添加提示框?就像HTML的一個元素的title屬性黑莓UI提示框

+0

您可以使用做'BitmapField'和'LabelField',並將它們添加到'VerticalFieldManger'或'Horizo​​ntalFieldManager'。您也可以爲此編寫自定義的「Field」。 – Rupak 2012-02-03 16:32:19

+0

感謝Rupak提供您的意見,實際上我的屏幕上有一個BitMapField,只需在此BitmapField聚焦或懸停時顯示標題,就像在此頁面上的twitter,facebook或google +圖標上移動鼠標時一樣我正在使用JDE6 – 2012-02-03 16:41:37

回答

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; 
    } 
} 
} 
+0

thnx rfsk2010這種解決我的問題 – 2012-02-03 17:09:11

+0

很高興你得到它的工作 – rfsk2010 2012-02-03 17:09:37