2013-01-15 120 views
0

我正在探索一些常见问题的可能解决方案(欢迎您的输入)。为了清楚起见,我简化了这个问题。GWT - 动态页面大小

比方说,我有一个显示号码的矩形框的小部件。每个盒子具有相同的静态宽度&高。有很多盒子超过1000个,这个数字会随着时间的推移而增长。

我想使用分页显示的箱子。我想要一个避免使用滚动条。所以我想根据页面大小动态更改每个页面上显示的框的数量。

什么是解决这个问题的最好方法,起初我以为如果container-widget实现RequiresResizeI should be able to capture the dimensions of the widget。但我想我需要让每个家长部件也实现RequiresResizeProvidesResize

有没有更好的方法?

感谢

回答

1

这是更简单:

Window.addResizeHandler(new ResizeHandler() { 

    @Override 
    public void onResize(ResizeEvent event) { 
     resize(); 
    } 

}); 

private void resize() { 
     // Measure your widget 
     // Decide how many squares to display 
} 

您将需要调用调整()时,您的视图首次加载,然后任何窗口大小调整将触发此方法为好。

0

你只需要实现RequiresResize和维护提供/ RequiresResize链如果想调整事件。但在你的情况,你只是想知道窗口或容器的大小,而不是调整大小事件(至少,这是我从你的问题推断)。

在这种情况下,您可以在决定分页之前使用容器小部件的getOffsetWidth()和getOffsetHeight()方法(请参阅http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/ui/UIObject.html#getOffsetHeight())。

在另一方面,如果再需要重新布局的事情,当窗口大小的变化,那么你必须像你说的使用提供/ RequireResize。如果您不想维护完整的层次结构,只需在根布局面板中放置一个隐藏的LayoutPanel,然后将resize事件路由到任何您想要的。不是一个非常干净的解决方案,而是一个解决方案......

2

在一个香草GWT项目去获得这种最简单的方法是使用布局面板类 - 这些使用你所提到的RequiresResizeProvidesResize接口。最好的方法是开始使用RootPanel而不是RootLayoutPanel。这个替代的起点包装一个RootPanel实例,并通过调用RequiresResize.onResize(如果存在)将它的子级调整到可用的浏览器空间。

小部件树的其余部分(孩子们加入到父母,等等),那么也应该使用这些接口来声明,他们需要调整的信息。很有可能你最终不会建立任何不支持的小部件,而是通常将现有的小部件(通过UiBinder或Composite)包装到一个新的小部件中 - 这就是你正在制作一个新小部件的技巧,以及默认一个不执行ProvidesResizeRequiresResize。当你构建你的应用程序时,有两个基本的解决方案:

  • 实现这两个接口。然后,在您的onResize()方法中,调用需要知道其大小已更改的顶级小部件的onResize()。这允许更多的控制,但需要更明确的代码来进行大小调整。最简单的方法是扩展ResizeComposite而不是Composite。或者,

  • 请勿扩展Widget(即不要扩展Composite/ResizeComposite/etc),而应实施IsWidget。这样可以避免在树中添加新的Widget类型,并将所有正在使用的小部件分组到一个恰好构建并设置它们的类型中。这是我的首选选项 - 它看起来不像一个小部件,通常更容易模拟,等等。现在,您需要有一个asWidget()方法返回您的小部件结构的基础 - 任何添加的东西都会直接与此对话(并直接调用它的onResize()),让你忽略他们需要交互的细节。这是我的首选。

+0

感谢您的明确解释......然而,我认为安德烈的解决方案将为我工作。 – hba