Wicket继承问题

时间:2011-11-02 20:15:40

标签: java inheritance wicket

我正在为大学开发一个Wicket应用程序,但我遇到了(一个有点棘手的)问题。

要设置一些上下文:我正在创建一个使用HTML5播放器的应用程序,我的解决方案是为包含播放器的页面的构造函数提供一些PageParamameters来进行查询并检索源代码为了媒体。

现在我的问题是我正在使用模板,所以我创建了一个自动放置页眉和页脚的页面,但我的播放器需要PageParameters才能正常工作而我正努力它可以从BasePage扩展,但是基页的构造函数也有一些参数,因此它可以根据它当前所在的页面动态更改标题上的文本。这使得super()方法变得棘手:

protected BasePage(String tabHeader, String header) {
    add(new Label("tab_title", tabHeader));
    add(new Header("header", header));
    add(new UserPanel("user_panel"));
    add(new Footer("footer"));
}

我的播放器页面:

public PlayerPage(PageParameters params) {
    String name = params.get("name").toString();
    MediaItem item = getItem(name.trim());

    add(new Label("tab_title", "MaeGûl - " + name)); //trying to get rid of this
    add(new Header("header", item.getName())); //and this
    add(new UserPanel("user_panel")); //and this

    if (item.getType().equals(ItemTypes.MUSIC)) {
        add(new AudioPlayer("player", item.getMediaSources()));
    } else if (item.getType().equals(ItemTypes.SERIES)
            || item.getType().equals(ItemTypes.MOVIES))
        add(new VideoPlayer("player", item.getMediaSources()));

    add(new Footer("footer")); //and this
}

正如您所看到的,如果我将super(tabHeader, header)放在我的PlayerPage构造函数中,则需要使用“name”参数来更新BasePage的标题和tabHeader,所以我是stupmed ...

对此有何解决方案?

2 个答案:

答案 0 :(得分:2)

您可以将BasePage更改为接受模型而不是字符串:

protected BasePage(IModel<String> tabHeader, IModel<String> header)

并将值的检索委托给专用模型,例如源自AbstractReadOnlyModel

public PlayerPage(PageParameters params) {
    super(new TabHeaderModel(params), new HeaderModel(params));
    ...
}

答案 1 :(得分:0)

当然,任何组件都可以使用一种方法来获取PageParameters。它是......

getPage().getPageParameters();

但是,要让getPageParameters()返回非空值,您必须使用Page调用Wicket super(params)构造函数,因此坚持要求BasePage有一个构造函数BasePage(PageParameters params)

事实上,在玩了一段时间之后,如果您对大多数网页使用BookmarkablePageLinkPageParameters,那么任何扩展Page的内容都应该只实现构造函数{{1 }}。如果您使用会话相关页面和大量Page(PageParameters params)类型的代码,则不适用。