User interface 在布局管理器中取消滚动
我找不到以下问题的解决方案。我有一个自定义列表字段,它与布局管理器的边界重叠。列表字段使用管理器中的导航事件以特殊颜色突出显示当前选定的行。布局管理器配置为支持滚动。当我向下滚动trackwheel时,布局管理器调用滚动,然后将导航事件传递给它的子项列表字段。它会导致不正确的滚动,因为管理器会将整个列表向下滚动到其底部,隐藏顶部的列表行,包括选定的行 我想要的是在当前选定的列表行仍然可见时忽略滚动,否则就使用它User interface 在布局管理器中取消滚动,user-interface,blackberry,layout,rim-4.2,User Interface,Blackberry,Layout,Rim 4.2,我找不到以下问题的解决方案。我有一个自定义列表字段,它与布局管理器的边界重叠。列表字段使用管理器中的导航事件以特殊颜色突出显示当前选定的行。布局管理器配置为支持滚动。当我向下滚动trackwheel时,布局管理器调用滚动,然后将导航事件传递给它的子项列表字段。它会导致不正确的滚动,因为管理器会将整个列表向下滚动到其底部,隐藏顶部的列表行,包括选定的行 我想要的是在当前选定的列表行仍然可见时忽略滚动,否则就使用它 我正在使用JDE 4.2.1假设我们有ListField实现: class
我正在使用JDE 4.2.1假设我们有ListField实现:
class LabelListField extends ListField implements ListFieldCallback {
private Vector mValues;
public LabelListField(Vector values) {
super(0);
setRowHeight(getFont().getHeight() + 10);
setCallback(this);
mValues = values;
setSize(mValues.size());
}
public void drawListRow(ListField listField, Graphics g, int index, int y,
int width) {
g.drawText((String) mValues.elementAt(index), 0, y);
}
public Object get(ListField list, int index) {
return mValues.elementAt(index);
}
public int indexOfList(ListField list, String prefix, int start) {
for (int x = start; x < mValues.size(); ++x) {
String value = (String) mValues.elementAt(x);
if (value.startsWith(prefix)) {
return x;
}
}
return -1;
}
public int getPreferredWidth(ListField list) {
return Display.getWidth();
}
}
在eJDE 4.2.1.17 8800上测试所有这些都是帮助我的解决方案。通过以这种特定的方式覆盖moveFocus,我成功地修改了布局管理器中滚动的默认行为——它跳过了列表字段的第一项,从而使它们保持在顶部
public int moveFocus(int amount, int status, int time) {
invalidate(getSelectedIndex());
int unused = super.moveFocus(amount, status, time);
return Math.abs(unused) + 1;
}
非常感谢你的帮助,我真的很感激。事实上,我已经用一种特殊的方式覆盖了moveFocus方法,从而解决了滚动问题。我会在一段时间后发布解决方案。
class Scr extends FullScreen implements FieldChangeListener {
LabelField mHeader;
ListManager mHFMList;
HorizontalFieldManager mHFMButton;
LabelListField mListField;
ButtonField mButton;
public Scr() {
super(DEFAULT_MENU | DEFAULT_CLOSE);
mHeader = new LabelField("List Field", FIELD_HCENTER);
add(mHeader);
Vector values = new Vector();
values.addElement("first");
values.addElement("second");
values.addElement("third");
values.addElement("fourth");
values.addElement("fifth");
values.addElement("sixth");
values.addElement("seventh");
values.addElement("eight");
mListField = new LabelListField(values);
mHFMList = new ListManager(mListField);
add(mHFMList);
mHFMButton = new HorizontalFieldManager(FIELD_HCENTER);
add(mHFMButton);
mButton = new ButtonField("Exit", ButtonField.CONSUME_CLICK);
mButton.setChangeListener(this);
mHFMButton.add(mButton);
}
public void fieldChanged(Field field, int context) {
if (mButton == field)
close();
}
}
public int moveFocus(int amount, int status, int time) {
invalidate(getSelectedIndex());
int unused = super.moveFocus(amount, status, time);
return Math.abs(unused) + 1;
}