0

我正在探索一些常见问题的可能解决方案(欢迎您的意见)。为了清楚起见,我已经简化了问题。

假设我有一个显示多个矩形框的小部件。每个盒子都有相同的静态宽度和高度。有很多超过 1000 个的盒子,这个数字会随着时间的推移而增长。

我正在考虑使用分页来显示框。我想避免使用滚动条。因此,我想根据页面大小动态更改每个页面上显示的框数。

解决这个问题的最好方法是什么,起初我想如果容器小部件实现RequiresResize 我应该能够捕获小部件的尺寸。但我认为我需要让每个父小部件也实现RequiresResizeand ProvidesResize.

有没有更好的办法?

谢谢

4

3 回答 3

2

在 vanilla GWT 项目中,最简单的方法是使用布局面板类 - 这些使用您提到的RequiresResize和接口。ProvidesResize最好的开始方法不是使用RootPanel,而是使用RootLayoutPanel. 此替代起点包装单个RootPanel实例,并通过调用RequiresResize.onResize它是否存在来将其大小调整为可用的浏览器空间。

然后,您的小部件树的其余部分(添加到父级的子级等)也应该使用这些接口来声明它们需要调整大小信息。很有可能您实际上不会构建任何不构建的小部件,而是将现有的小部件(使用 UiBinder 或 Composite)包装到新的小部件中 - 诀窍在于您正在制作一个新的小部件,并且通过默认一个不实现ProvidesResizeor RequiresResize。构建应用程序时的两个基本解决方案:

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

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

于 2013-01-15T21:27:20.573 回答
1

这要简单得多:

Window.addResizeHandler(new ResizeHandler() {

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

});

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

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

于 2013-01-15T23:21:12.430 回答
0

如果您想要调整事件大小,您只需要实现 RequiresResize 并维护 Provides/RequiresResize 链。但是在您的情况下,您只想知道窗口或容器的大小,而不是 resize 事件(至少,这是我从您的问题中推断出来的)。

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

另一方面,如果您需要在窗口大小更改时重新布局,那么您必须按照您的说法使用 Provides/RequireResize。如果您不想保持完整的层次结构,只需在根布局面板中放置一个隐藏的 LayoutPanel 并将调整大小事件路由到您想要的任何内容。不是一个非常干净的解决方案,而是一个解决方案......

于 2013-01-15T20:30:09.993 回答