如何在具有SuggestBoxPopupPanel上设置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;
        }
    }
}

}

10-05 23:08