1

我正在尝试修改 GWT 2.1 HelloMVP 示例代码以使用更复杂的 UI。(由于两个链接限制,我不允许提供链接)

我的问题是 ActivityManager.setDisplay 只接受实现 AcceptsOneWidget 的对象。LayoutPanel 和其他 ComplexPanel 不实现 AcceptsOneWidget。示例代码改为使用 SimplePanel。但我似乎无法在 SimplePanel 中嵌套复杂的小部件(它们不显示)。

我发现了一些关于这个问题的讨论:

http://www.google.com/url?sa=D&q=https://stackoverflow.com/questions/5143196/is-there-a-acceptsonewidget-which-also-providesresze-other-than-scrollpanel%3Fanswertab% 3Dactive%23tab-top

http://www.google.com/url?sa=D&q=http://www.tempura.org/rants/2010/10/using-layoutpanels-with-gwt-2-1s-activitymanager/

人们建议解决方案是创建一个我想要实现 AcceptsOneWidget 接口的 ComplexPanel 的子类。像这样:

public class PanelForView extends LayoutPanel implements AcceptsOneWidget { 
     IsWidget myWidget = null; 

    @Override 
     public void setWidget(IsWidget w) { 
         if (myWidget != w)  { 
             if (myWidget != null) { 
                 remove(myWidget); 
             } 

            if (w != null) { 
                 add(w); 
             } 

            myWidget = w; 
         } 
     } 
} 

这听起来不错,但似乎对我不起作用。也许是因为我使用的是 GWT 2.3 而不是 2.1 或 2.2。在我的 EntryPoint 中,我希望简单地将 SimplePanel 替换为我的新 PanelForView 类,并让应用程序像以前一样运行。像这样:

public class HelloMVP implements EntryPoint { 
    private Place defaultPlace = new HelloPlace("World!"); 
//  private SimplePanel appWidget = new SimplePanel(); // Replace this with PanelForView 
    private PanelForView appWidget = new PanelForView(); // This compiles but doesn't work. 
//  private SimpleLayoutPanel appWidget = new SimpleLayoutPanel(); // This doesn't work either. 

    public void onModuleLoad() { 
        // Create ClientFactory using deferred binding so we can replace with different 
        // impls in gwt.xml 
        ClientFactory clientFactory = GWT.create(ClientFactory.class); 
        EventBus eventBus = clientFactory.getEventBus(); 
        PlaceController placeController = clientFactory.getPlaceController(); 

        // Start ActivityManager for the main widget with our ActivityMapper 
        ActivityMapper activityMapper = new AppActivityMapper(clientFactory); 
        ActivityManager activityManager = new ActivityManager(activityMapper, eventBus); 
        activityManager.setDisplay(appWidget); 

        // Start PlaceHistoryHandler with our PlaceHistoryMapper 
        AppPlaceHistoryMapper historyMapper= GWT.create(AppPlaceHistoryMapper.class); 
        PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper); 
        historyHandler.register(placeController, eventBus, defaultPlace); 

        RootPanel.get().add(appWidget); 
        // Goes to place represented on URL or default place 
        historyHandler.handleCurrentHistory(); 
    } 
} 

这编译得很好,但是当我运行它时,我现在只看到一个空白屏幕。初始化 ComplexPanel 是否需要做一些额外的事情?我是不是误会了什么?我试过添加小部件并调用 setSize 无济于事。这是我的第一个 GWT 项目。

谢谢你的时间。

科里

4

3 回答 3

2

您应该能够轻松使用 SimplePanel(或实现 AcceptsOneWidget 的 Composite 子类)。最好的方法是考虑包含的小部件。您可以在 SimplePanel 的一个小部件区域中添加:HTMLPanel、FlowPanel、VerticalPanel 等。

但是,一旦你这样做了,你就改变了 ActivityMapper/AcceptsOneWidget/SimplePanel 的预期用途

您可以通过以下方式创建更复杂的用户界面:

添加另一个 ActivityMapper(具有不同的 UI 区域 - SimplePanel - 应该从一个地方更改为另一个地方)或添加一个小部件区域(从一个地方到另一个地方不会更改)

或者*

让您的 Activity 控制更复杂的视图(将 ActivityMapper.setDisplay 小部件保留为 SimplePanel - 但随后让 Activity 设置 HTMLPanel、VerticalPanel 等)

一个非常流行的实现是保留一个 SimplePanel 作为 ActivityMapper 的内容区域。然后使用 UiBinder(以 HTMLPanel 作为顶层元素)

我们可以调用 UiBinder: "view" 它可以有很多区域

view.getTopArea() - SimplePanel, view.getLeft() - FlowPanel, view.getNameArea - Anchor/InlineHTML

所有这些不同的元素都被包裹在视图中,可以是一个组合

然后,在你的

activity.start(AcceptsOneWidget panel){
 panel.setWidget(view);//insert your complex view into the SimplePanel view
  ...
}
于 2011-06-10T22:52:44.513 回答
0

好的,所以当我遇到这个问题时,我只是在尝试使用示例应用程序附带的非常简单的 UI。

我还尝试保留 SimplePanel 并让 Activity 返回一个包含标签和图像的 HeaderPanel(Ashton 的答案中提到的第二种方法)。我以为这行不通。我在博客和论坛中看到似乎表明这不起作用的评论。但是,一旦我开始使用 DockPanel 和嵌套的 TabPanel 等实际构建 UI,突然间一切都开始正常显示。我不知道为什么。我想这可能是我的代码中的一个错误。但我现在正在路上。我不想回去诊断到底出了什么问题。:)

谢谢各位的建议!

科里

于 2011-06-13T22:57:32.883 回答
0

使用 RootLayoutPanel 而不是 RootPanel

于 2011-08-05T09:17:31.067 回答