我正在尝试创建一个复选框,下面的对象列表就在那里。我试图关注checkbox,但它既不是可聚焦的,也不是可检查的,.The焦点位于下面列表的第一个元素上。
如何将复选框作为焦点并使其可复选?在这里,checkbox位于我要添加列表的VerticalFieldManager中。

这里我要添加两个东西:一个是水平场管理器(OnlineCheckBoxHfm),另一个是objectListField(buddyList)。
现在的问题是,默认的焦点在列表的第一个元素上,而我无法将焦点放在我放入CheckBox的HorizontalFieldManager上。由于focus在HorizontalFieldManager上不可用,所以我无法检查CheckBox。
public class BuddyMenuItem extends VerticalFieldManager implements FieldChangeListener{
public BuddyMenuItem(BuddyListField buddyList) {
_bitmap = EncodedImage.
getEncodedImageResource("buddies_header.png");
mainMenuBmp = new BitmapField(Constant.sizePic(_bitmap, _bitmap.getHeight(), Display.getWidth()));
HorizontalFieldManager onlineCheckBoxHfm=new HorizontalFieldManager(HorizontalFieldManager.USE_ALL_WIDTH);
_onlineCheckBox=new CheckboxField("Online",false,CheckboxField.FIELD_LEFT|CheckboxField.FOCUSABLE);
_onlineCheckBox.setChangeListener(this);
onlineCheckBoxHfm.add(_onlineCheckBox);
onlineCheckBoxHfm.add(new NullField(NullField.FOCUSABLE));
// add(mainMenuBmp);
add(onlineCheckBoxHfm);
add(buddyList);
}BuddyListField类如下:
import java.util.Vector;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Keypad;
import net.rim.device.api.ui.TouchEvent;
import net.rim.device.api.ui.Touchscreen;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ObjectListField;
import com.np.naijapings.Buddy;
import com.np.naijapings.NaijapingsMain;
public class BuddyListField extends ObjectListField {
public static final Bitmap offlineIcon = Bitmap.getBitmapResource("offline.png");
public static final Bitmap awayIcon = Bitmap.getBitmapResource("away.png");
public static final Bitmap busyIcon = Bitmap.getBitmapResource("busy.png");
public static final Bitmap onlineIcon = Bitmap.getBitmapResource("online.png");
public static final Bitmap unreadIcon = Bitmap.getBitmapResource("unread.png");
public static final Bitmap maleIcon=Bitmap.getBitmapResource("male.png");
public static final Bitmap[] statusIcon = new Bitmap[]{offlineIcon, awayIcon, busyIcon, onlineIcon};
public static Vector buddyVector;
public static int onlineBuddyCount=0;
private final NPingsMain nPings;
public static boolean showOnlineBuddy=false;
private Bitmap _chatBmp=Bitmap.getBitmapResource("chat.png");
public BuddyListField(NPingsMain n,boolean showOnlineBuddy) {
nPings = n;
buddyVector = new Vector();
this.showOnlineBuddy=showOnlineBuddy;
}
public Buddy getBuddyAt(int index) {
return (Buddy)buddyVector.elementAt(index);
}
protected boolean keyChar(char key, int status, int time) {
int idx;
switch(key) {
case Keypad.KEY_ENTER:
idx = this.getSelectedIndex();
if (idx >= 0) {
NPingsMain.currentBuddy = (Buddy)buddyVector.elementAt(idx);
NPingsMain.openBuddy(NPingsMain.currentBuddy);
}
return true;
case 'e':
idx = this.getSelectedIndex()-1;
if (idx >= 0) {
this.setSelectedIndex(idx);
}
return true;
case 's':
return true;
case 'f':
return true;
case 'x':
idx = this.getSelectedIndex()+1;
if (idx > 0 && idx < this.getSize()) {
this.setSelectedIndex(idx);
}
return true;
case 't':
if (this.getSize() > 0) {
this.setSelectedIndex(0);
}
return true;
}
return false;
}
protected boolean navigationClick(int status, int time) {
int idx = this.getSelectedIndex();
if(Touchscreen.isSupported()){
if (idx >= 0) {
nPings.currentBuddy = (Buddy)buddyVector.elementAt(idx);
if((nPings.currentBuddy.status==0x00000003)||(nPings.currentBuddy.status==0x00000002)||(nPings.currentBuddy.status==0x00000001)){
NPingsMain.openBuddy(nPings.currentBuddy);
}
}
return false;
}else{
if (idx >= 0) {
nPings.currentBuddy = (Buddy)buddyVector.elementAt(idx);
if((nPings.currentBuddy.status==0x00000003)||(nPings.currentBuddy.status==0x00000002)||(nPings.currentBuddy.status==0x00000001)){
NPingsMain.openBuddy(nPings.currentBuddy);
}
}
return false;
}
}
protected boolean touchEvent(TouchEvent message) {
//if(message.getEvent()==TouchEvent.CLICK){
int idx;
switch(TouchEvent.CLICK) {
case TouchEvent.CLICK:
idx = this.getSelectedIndex();
if (idx >= 0) {
nPings.currentBuddy = (Buddy)buddyVector.elementAt(idx);
if((nPings.currentBuddy.status==0x00000003)||(nPings.currentBuddy.status==0x00000002)||(nPings.currentBuddy.status==0x00000001)){
NPingsMain.openBuddy(nPings.currentBuddy);
}
}
return true;
case 'e':
idx = this.getSelectedIndex()-1;
if (idx >= 0) {
this.setSelectedIndex(idx);
}
return true;
case 's':
return true;
case 'f':
return true;
case 'x':
idx = this.getSelectedIndex()+1;
if (idx > 0 && idx < this.getSize()) {
this.setSelectedIndex(idx);
}
return true;
case 't':
if (this.getSize() > 0) {
this.setSelectedIndex(0);
}
return true;
}
// return false;
// }
return super.touchEvent(message);
}
public void buddyReposition(Buddy b) {
int index = buddyVector.indexOf(b);
buddyReposition(index);
}
public void buddyReposition(int oldIndex) {
Buddy b = (Buddy)buddyVector.elementAt(oldIndex);
int newIndex = 0;
if (b.unread) {
newIndex = 0;
} else {
while (newIndex < buddyVector.size() &&
((b == (Buddy)buddyVector.elementAt(newIndex)) ||
((Buddy)buddyVector.elementAt(newIndex)).unread ||
(b.status < ((Buddy)buddyVector.elementAt(newIndex)).status)))
++newIndex;
}
newIndex = (oldIndex < newIndex) ? (newIndex-1) : newIndex;
if (oldIndex != newIndex) {
buddyVector.removeElementAt(oldIndex);
buddyVector.insertElementAt(b, newIndex);
}
this.invalidate();
}
public int findBuddyIndex(String jid) {
for (int i = buddyVector.size()-1; i >= 0; i--) {
if (((Buddy)buddyVector.elementAt(i)).jid.equals(jid))
return i;
}
return -1;
}
public Buddy findBuddy(String jid) {
for (int i = buddyVector.size()-1; i >= 0; i--) {
if (((Buddy)buddyVector.elementAt(i)).jid.equals(jid))
return (Buddy)buddyVector.elementAt(i);
}
return null;
}
public void addBuddy(Buddy b) {
//CHECK FOR ONLINE BUDDIES
buddyVector.addElement(b);
this.insert(buddyVector.indexOf(b));
}
public void deleteBuddy(int index){
buddyVector.removeElementAt(index);
this.delete(index);
}
public void drawListRow(ListField listField, Graphics graphics, int index, int y, int width) {
// NOTICE 14 would be consist the icon size
onlineBuddyCount=0;
String bName="";
Buddy b = (Buddy)buddyVector.elementAt(index);
if(showOnlineBuddy==true){
if(b.status==0x00000003||b.status==0x00000002||b.status==0x00000001){
//DRAW ROW BACKGROUND START
if (listField.getSelectedIndex() != index) {
graphics.setBackgroundColor(index % 2 == 0 ? Color.WHITE
: Color.LIGHTGRAY);
graphics.clear();
listField.setFocus();
}
//DRAW ROW BACKGROUND END
onlineBuddyCount++;
if(b.name.endsWith("net")){
int i=b.name.indexOf("@");
bName=b.name.substring(0, i);
}else{
bName=b.name;
}
if (b.unread) {
graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),unreadIcon , 0, 0);
} else {
graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),statusIcon[b.status] , 0, 0);
}
graphics.drawText(bName, 25, y, DrawStyle.HDEFAULT, width-12);
graphics.drawBitmap(Display.getWidth()-_chatBmp.getWidth(), y-6, _chatBmp.getWidth(), _chatBmp.getHeight(), _chatBmp, 0, 0);
}
}else{
//DRAW ROW BACKGROUND START
if (listField.getSelectedIndex() != index) {
graphics.setBackgroundColor(index % 2 == 0 ? Color.WHITE
: Color.LIGHTGRAY);
graphics.clear();
listField.setFocus();
}
//DRAW ROW BACKGROUND END
onlineBuddyCount++;
if(b.name.endsWith("net")){
int i=b.name.indexOf("@");
bName=b.name.substring(0, i);
}else{
bName=b.name;
}
if (b.unread) {
graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),unreadIcon , 0, 0);
} else {
graphics.drawBitmap(0, y+3, unreadIcon.getWidth(), unreadIcon.getHeight(),statusIcon[b.status] , 0, 0);
}
graphics.drawText(bName, 25, y, DrawStyle.HDEFAULT, width-12);
graphics.drawBitmap(Display.getWidth()-_chatBmp.getWidth(), y-6, _chatBmp.getWidth(), _chatBmp.getHeight(), _chatBmp, 0, 0);
}
}
public void clearBuddies() {
if (nPings.buddyList != null) {
int i = buddyVector.size();
while (i-- > 0)
this.delete(0);
nPings.buddyscreen.delete(nPings.buddyList);
nPings.buddyList = null;
}
}
}发布于 2013-03-19 17:36:29
我不能运行你的代码,因为里面有太多我没有的东西(其他类,PNG,等等),但我愿意打赌你的问题在这里:
public void drawListRow(ListField listField, Graphics graphics, int index, int y, int width) {
// other stuff here
listField.setFocus();调用setFocus()将在列表字段( BuddyListField)上设置焦点。所以,你的CheckBoxField 实际上是可聚焦的。问题是您添加了复选框字段,然后添加了listfield。当使用drawListRow()绘制列表域时,您总是将焦点从复选框上移开,并将其放回列表域。
删除对listField.setFocus()的调用...他们有两个人。
drawListRow()是用于绘图的。我不确定我能想出一个原因,为什么那个方法中的任何东西实际上应该改变焦点,这就是setFocus()所做的。
https://stackoverflow.com/questions/15446142
复制相似问题