如何在具有SuggestBox
的PopupPanel
上设置max-height的情况下自动滚动GWT SuggestBox
?当前,当用户按下键盘上的向上键和向下的键时,样式会更改建议项,然后按Enter键将在列表中选择当前选定的项。
当项目位于最大高度以下时,滚动条不会滚动。
我尝试扩展SuggestBox
和内部类DefaultSuggestionDisplay
以覆盖moveSelectionDown()
和moveSelectionUp()
来显式调用popup.setScrollTop()
。
为了做到这一点,我需要访问当前所选MenuItem
的绝对顶部,因此需要访问SuggestionMenu
,这也是SuggestBox的内部类,它是私有(private)的,并声明为DefaultSuggestionDisplay
中的私有(private)成员而没有getter。由于GWT是JavaScript,因此我们不能使用反射来访问它。...是否有人可以解决此问题?
谢谢。
最佳答案
我一直在搜索,找不到合适的解决方案(除了重新实现SuggestBox)。以下避免重新实现SuggestBox:
private static class ScrollableDefaultSuggestionDisplay extends SuggestBox.DefaultSuggestionDisplay {
private Widget suggestionMenu;
@Override
protected Widget decorateSuggestionList(Widget suggestionList) {
suggestionMenu = suggestionList;
return suggestionList;
}
@Override
protected void moveSelectionDown() {
super.moveSelectionDown();
scrollSelectedItemIntoView();
}
@Override
protected void moveSelectionUp() {
super.moveSelectionUp();
scrollSelectedItemIntoView();
}
private void scrollSelectedItemIntoView() {
// DIV TABLE TBODY TR's
NodeList<Node> trList = suggestionMenu.getElement().getChild(1).getChild(0).getChildNodes();
for (int trIndex = 0; trIndex < trList.getLength(); ++trIndex) {
Element trElement = (Element)trList.getItem(trIndex);
if (((Element)trElement.getChild(0)).getClassName().contains("selected")) {
trElement.scrollIntoView();
break;
}
}
}
}