【问题标题】:GWT - Dynamic Page SizeGWT - 动态页面大小
【发布时间】:2013-01-15 18:21:52
【问题描述】:

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

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

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

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

有没有更好的办法?

谢谢

【问题讨论】:

    标签: gwt


    【解决方案1】:

    在普通 GWT 项目中,最简单的方法是使用布局面板类 - 这些使用您提到的 RequiresResizeProvidesResize 接口。最好的方法不是使用RootPanel,而是使用RootLayoutPanel。这个替代起点包装了一个 RootPanel 实例,并通过调用 RequiresResize.onResize(如果存在)将其大小调整为可用的浏览器空间。

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

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

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

    【讨论】:

    • 感谢您的明确解释...不过我认为 Andrei 的解决方案对我有用。
    【解决方案2】:

    更简单:

    Window.addResizeHandler(new ResizeHandler() {
    
        @Override
        public void onResize(ResizeEvent event) {
            resize();
        }
    
    });
    
    private void resize() {
            // Measure your widget
            // Decide how many squares to display
    }
    

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

    【讨论】:

      【解决方案3】:

      如果您想要调整事件大小,您只需要实现 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 并将调整大小事件路由到您想要的任何内容。不是一个非常干净的解决方案,而是一个解决方案......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多