2011-04-13 41 views
1


我知道GWT ScrollPanel中存在一些问题,以及它如何工作,但让我解释一下情况。获取GWT ScrollPanel在底部启动其垂直滚动条

我工作的一个项目,以实现对路由器的QoS。我现在处于项目的开发阶段,我需要创建一个web界面来添加诸如ssh和http等协议,并为他们提供带宽。

为了节省内存的使用和网络流量,我不使用GWT-EXT或智能GWT。因此,为了设置带宽,我使用了一个ScrollPanel和一个空的SimplePanel(这太大了),只剩下滚动条。

现在,这里的问题: 我希望每个滚动条为每个加入协议的底部,而不是顶部开始。如果我先手动移动滚动条,那么任何函数都可以工作,如scrollToBottom()或setScrollPosition(),我可以通过代码获得它的工作。如果我想在手动移动滚动条之前通过代码移动滚动条,但是,我无法调用它的功能。
(我会发布图片,但我还不能 - 新用户)

摘要:

所以,如果我加上协议(使用称为btnAjouter按钮)一对,两个slidebars(保证带宽和一个最大带宽),每个协议从顶部开始。我希望他们从小部件的负载开始。 有没有办法做到这一点? 在此先感谢!

格伦

回答

0

你能附加一个处理程序监听添加事件和处理程序中做这样的事情:

panel.getElement().setScrollTop(panel.getElement().getScrollHeight());

“面板”是您在协议添加到面板。它不一定是一个ScrollPanel。 HTMLPanel将起作用。

你可以用一个命令这个方法,它是否需要浏览器事件循环返回后,被称为传递给Schedule.scheduleDeferred

 
Schedule.scheduleDeferred(new Scheduler.ScheduledCommand(
    public void execute() { 
    panel.getElement().setScrollTop(panel.getElement().getScrollHeight()); 
    } 
)); 

+0

这并没有工作,但只是因为Javascript无法跟上... – Glenn 2011-04-15 08:01:19

+0

在这种情况下,也许可以创建一个命令来封装此函数并将其传递给Scheduler.scheduleDeferred(http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/core /client/Scheduler.html#scheduleDeferred(com.google.gwt.core.client.Scheduler.ScheduledCommand) – smallbec 2011-04-16 08:12:16

1

好了,我的同事找到了解决办法。虽然这是一个相当脏的东西。 问题是,这些函数只有在问题元素被附加到DOM时才起作用。我确实使用Window.alert()进行了检查,看它是否已连接,并且是。但问题在于功能被提前调用,例如在按钮上它会起作用。创建和附加元素的一切发生得非常快,所以JavaScript不能跟上,这是解决方案:

Timer t1 = new Timer() 
     { 
      @Override 
      public void run() 
      { 
       s1.getScroll().scrollToBottom(); 
       s2.getScroll().scrollToBottom(); 
      } 
     }; 
t1.schedule(20); 

使用定时器大约是不是最干净的解决方案,但它的工作原理。 s1和s2是我的自定义滑块,getScroll()获取附加到它的ScrollPanel。

1

您可以扩展ScrollPanel并重写的onLoad方法。在小部件连接到浏览器的文档后立即调用此方法。

@Override 
protected void onLoad() { 
    scrollToBottom(); 
}