Java GXT-Can';t到达文本区域上的onscroll事件处理程序
我试图在文本区域(gxt)上设置一个处理程序,以了解用户何时到达文本区域的顶部Java GXT-Can';t到达文本区域上的onscroll事件处理程序,java,gwt,gxt,Java,Gwt,Gxt,我试图在文本区域(gxt)上设置一个处理程序,以了解用户何时到达文本区域的顶部 TextArea logTextArea = new TextArea(); logTextArea.setReadOnly(true); logTextArea.addDomHandler(new ScrollHandler() { @Override public void onScroll(ScrollEvent event) { InputElement textAreaEl
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
这个处理程序从未在scroll上调用过,但我也尝试过很多其他事件,比如mouseover、mousewell、mouseclick。。。所有这些活动都奏效了。有人能帮上忙吗?AFAIK,如果事件的目标和小部件不是相同的元素,则scroll事件在基于单元格的现成小部件中不起作用。 GXT的TextArea是一个具有这种DOM结构的小部件 这是因为scroll事件是一个“非冒泡”事件。 AFAIK,GWT小部件,使用单元格,对通过GWT事件系统调度的非冒泡事件具有特殊处理。 而且支持非冒泡事件的类型列表太短,仅限于
焦点
、模糊
、加载
和错误
事件。
有关详细信息,请参见CellBasedWidgetImplStandard
class
我建议的第一个解决方案是为textarea显式分配onscroll处理程序。
例如:
Event.sinkEvents(textAreaElement, Event.getEventsSunk(textAreaElement) | Event.ONSCROLL);
这里的textAreaElement
-是textareadom元素
但每次当单元格重新呈现其内容时(例如,当为TextArea小部件调用setValue方法时),都应该这样做
其他解决方案有点老套,使用私有api实现,但只能对基于单元的小部件应用一次。您可以执行与在CellBasedWidgetImplStandard.sinkEvent(小部件,字符串)
中相同的操作,例如:
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项目中创建问题的主题。AFAIK,如果事件的目标和小部件不是相同的元素,则scroll事件在基于单元格的现成小部件中不起作用。 GXT的TextArea是一个具有这种DOM结构的小部件 这是因为scroll事件是一个“非冒泡”事件。 AFAIK,GWT小部件,使用单元格,对通过GWT事件系统调度的非冒泡事件具有特殊处理。 而且支持非冒泡事件的类型列表太短,仅限于
焦点
、模糊
、加载
和错误
事件。
有关详细信息,请参见CellBasedWidgetImplStandard
class
我建议的第一个解决方案是为textarea显式分配onscroll处理程序。
例如:
Event.sinkEvents(textAreaElement, Event.getEventsSunk(textAreaElement) | Event.ONSCROLL);
这里的textAreaElement
-是textareadom元素
但每次当单元格重新呈现其内容时(例如,当为TextArea小部件调用setValue方法时),都应该这样做
其他解决方案有点老套,使用私有api实现,但只能对基于单元的小部件应用一次。您可以执行与在CellBasedWidgetImplStandard.sinkEvent(小部件,字符串)
中相同的操作,例如:
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项目中产生问题的主题。您能展示一下如何使用textarea,如何将其附加到其他小部件上吗?我编辑了我的答案。谢谢-另一个猜测,因为这被证明是错误的:您能为ScrollEvent显示完全限定的类名吗,例如,它在import语句中说了什么?com.google.gwt.event.dom.client.ScrollEvent这也是正确的。如果没有更多的上下文等等,我将很难说。稍后我将尝试运行相同的代码,并确认它确实有效。我唯一能想到的是-你怎么知道处理程序没有被调用-你没有让它做任何事情,只是读取值然后把它们扔掉?你能展示一下你是如何使用textarea的,你是如何将它附加到其他小部件上的吗?我编辑了我的答案。谢谢-另一个猜测,因为这被证明是错误的:您能为ScrollEvent显示完全限定的类名吗,即它在导入语句中所说的吗?com.google.gwt.event.dom.client.ScrollEvent这也是正确的。如果没有更多的上下文等等,我将很难说。稍后我将尝试运行相同的代码,并确认它确实有效。我唯一能想到的是——你怎么知道处理程序没有被调用——你没有让它做任何事情,只是读取值然后扔掉它们?