我無法找到解決方案,以解決以下問題。我有自定義列表字段,它與其佈局管理器的邊界重疊。列表字段消耗來自管理器的導航事件以突出顯示具有特殊顏色的當前選定行。佈局管理器配置爲支持滾動。當我滾動滾輪時,佈局管理器調用滾動,然後將導航事件傳遞給其子列表字段。它會導致不正確的滾動,因爲管理器將整個列表滾動到頂部的底部隱藏列表行(包括所選行)。取消滾動佈局管理器
我想要的是忽略滾動,而當前選定的列表仍然可見,否則使用它。
我使用JDE 4.2.1
我無法找到解決方案,以解決以下問題。我有自定義列表字段,它與其佈局管理器的邊界重疊。列表字段消耗來自管理器的導航事件以突出顯示具有特殊顏色的當前選定行。佈局管理器配置爲支持滾動。當我滾動滾輪時,佈局管理器調用滾動,然後將導航事件傳遞給其子列表字段。它會導致不正確的滾動,因爲管理器將整個列表滾動到頂部的底部隱藏列表行(包括所選行)。取消滾動佈局管理器
我想要的是忽略滾動,而當前選定的列表仍然可見,否則使用它。
我使用JDE 4.2.1
所有這裏的,幫助我解決。通過以這種特定方式覆蓋moveFocus,我設法修改了佈局管理器中滾動的默認行爲 - 它跳過列表字段的第一項,以使它們保持最佳狀態。
public int moveFocus(int amount, int status, int time) {
invalidate(getSelectedIndex());
int unused = super.moveFocus(amount, status, time);
return Math.abs(unused) + 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();
}
}
如果我們要上下領域內的這種方式排列此列表: ListField with scroll http://img6.imageshack.us/img6/7025/8800j.png
我們可以使用自定義管理器限制其高度:
class ListManager extends HorizontalFieldManager {
ListField mListField;
public ListManager(ListField listField) {
super(VERTICAL_SCROLL | VERTICAL_SCROLLBAR);
mListField = listField;
add(mListField);
}
public int getPreferredHeight() {
int result = Display.getHeight();
Manager manager = getManager();
if (null != manager) {
for (int i = 0, count = manager.getFieldCount(); i < count; i++) {
if (manager.getField(i) != this)
result -= manager.getField(i).getPreferredHeight();
}
}
// size down to fit max rows without splitting
result = result - result % mListField.getRowHeight();
return result;
}
protected void sublayout(int maxWidth, int maxHeight) {
super.sublayout(maxWidth, maxHeight);
setExtent(maxWidth, getPreferredHeight());
}
}
現在我們可以使用它:
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();
}
}
測試在eJDE 4.2.1.17 8800
非常感謝您的幫助,我非常感謝。實際上,我已經通過以特殊方式覆蓋moveFocus方法來解決我的滾動問題。我會在一段時間後發佈解決方案。 – nixau 2009-09-12 20:18:21
歡迎你!這將是偉大的,有你的答案! – 2009-09-13 07:01:21