java - GXT - 无法到达文本区域上的 onscroll 事件处理程序

标签 java gwt gxt

我试图在文本区域(gxt)上设置一个处理程序来了解用户何时到达文本区域的顶部。

TextArea logTextArea = new TextArea();
logTextArea.setReadOnly(true);
logTextArea.addDomHandler(new ScrollHandler() {

    @Override
    public void onScroll(ScrollEvent event) {
        InputElement textAreaElement = logTextArea.getCell().getInputElement(logTextArea.getElement());
        int scrollTop = textAreaElement.getScrollTop();
    }
}, ScrollEvent.getType());

VerticalLayoutContainer dataContainer = new VerticalLayoutContainer();

HorizontalLayoutContainer secondRow = new HorizontalLayoutContainer();
secondRow.add(logTextArea, new HorizontalLayoutData(1, 1, new Margins(5, 10, 5, 10)));

dataContainer.add(secondRow, new VerticalLayoutData(1, 0.5));

add(dataContainer);//this class extends ContentPanel

这个处理程序永远不会在滚动时调用,但我也尝试了很多其他事件,例如 mouseover、mousewhel、mouseclick ...并且所有这些事件都有效。有人可以提供任何想法吗?

最佳答案

据我所知,如果事件的目标和小部件不是相同的元素,则滚动事件将无法在开箱即用的基于单元格的小部件中工作。 而GXT的TextArea就是一个具有这种DOM结构的widget。

这都是因为滚动事件是一个“非冒泡”事件。 AFAIK,使用单元格的 GWT 小部件对通过 GWT 事件系统调度的非冒泡事件有特殊的处理。 并且支持非冒泡事件的类型列表太短,仅限于 focusblurloaderror 事件。 有关详细信息,请参阅 CellBasedWidgetImplStandard 类。

我可能建议的

第一个解决方案是为文本区域显式分配 onscroll 处理程序。 例如:

Event.sinkEvents(textAreaElement, Event.getEventsSunk(textAreaElement) | Event.ONSCROLL);

此处 textAreaElement - 是 textarea DOM 元素。

但是每次单元格重新呈现其内容时都应该执行此操作(例如,当为 TextArea 小部件调用 setValue 方法时)。

其他解决方案有点老套,使用私有(private) api 实现,但只能应用于基于单元格的小部件一次。您可以执行与 CellBasedWidgetImplStandard.sinkEvent(Widget, String) 中相同的操作,例如:

WidgetHelper.sinkEvent(logTextArea.getElement(), BrowserEvents.SCROLL);

其中 WidgetHelper 可能如下所示:

public class WidgetHelper {
    public static void sincEvent(Element element, String typeName){
        element.setAttribute("__gwtCellBasedWidgetImplDispatching" + typeName, "true");
        sinkEvent0(element, typeName);
    }

    private static native void sinkEvent0(Element element, String typeName) /*-{
        element.addEventListener(typeName,
                        @com.google.gwt.user.cellview.client.CellBasedWidgetImplStandard::dispatchNonBubblingEvent, true);
    }-*/;
}

这可能是在 GWT 项目中创建问题的主题。

关于java - GXT - 无法到达文本区域上的 onscroll 事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49512214/

相关文章:

java - KeyPress 处理程序不适用于第一个字母

java - JScrollPane背景中的JLabel不改变

java - Android工具栏的文字大小和样式

java - 将图像添加到 Android Studio 中的 Java 项目?

java - 让 Guava 在 GWT 上工作

java - 使用 GWT 的 FlexTable 的鼠标悬停

gwt - 外部 GWT 与 GWT-EXT

java - IntelliJ Sync Eclipse 文件 - 此设置保存在哪里?

java - 无法让 SplitLayoutPanel 工作 - GWT + UIBinder 快把我逼疯了

java - 如何在 Ext GWT 中的 RequestBuilder 中发送网格过滤器参数?