2011-07-20 44 views
0

我有導航數據超過一個LinkTree的其中應在另一個DIV更換組件。阿帕奇便門:Componenet.replaceWith從Linktree.onNodeSelected(組分)()

對於此樹我有treestatelistener實施

public void nodeSelected(Object node) { 
    log.debug("nodeSelected: " + node+ " class: " + node.getClass()); 
      Component content = new Label("content"); 
      content.replaceWith(new Label("content", "Hello World")); 
     } 
    } 
} 

我得到的消息:

「此方法只可以在已添加 部件上叫到其父母「。

帶有標籤「內容」的標籤被添加到init頁面,所以它在那裏。我做錯了什麼?

回答

0

我總是有問題,只需調用Component.replaceWith()。由於我正在使用AJAX做這件事,我總是需要調用一個target.add()。

我的解決辦法是對現在有一個類MyTree延伸LinkTree中和在該類覆蓋newNodeComponent()。

因爲在我的應用程序中發生的一切都發生在IndexPage.class上,在那裏我只是替換組件,我添加了一個方法handleSelection()到IndexPage.Class(擴展BasePage擴展網頁)。在那裏,我決定的基礎上,點擊nodeObject,如何在IndexPage

Public Class MyTree extends Linktree{ 
    protected Component newNodeComponent(String id, IModel<Object> model) { 
    @Override 
     protected void onNodeLinkClicked(Object node, BaseTree tree, AjaxRequestTarget target) { 
      super.onNodeLinkClicked(node, tree, target); 
      ((IndexPage)getPage()).handleSelection(target, (TreeNode)node); 
     } 

     @Override 
     protected ResourceReference getResourceFolderOpen(Object node) { 
      return getResourceForNode(node); 
     } 

     @Override 
     protected ResourceReference getResourceFolderClosed(Object node) { 
      return getResourceForNode(node); 
     } 

     @Override 
     protected ResourceReference getResourceItemLeaf(Object node) { 
      return super.getResourceItemLeaf(node); 
     } 

     @Override 
     protected ResourceReference getImageResourceReference(BaseTree tree, Object node) { 
      return getResourceForNode(node); 
     } 
    } 
} 

我希望這是propperly解釋更換部件,否則:問題或意見想要的!

2

你正在創建每次你的樹節點監聽器被調用時,新的父組件,不添加「內容」標籤。 我的建議是嘗試這樣的東西 -

public MyPage extends WebPage { 
    private Component parent = new WebMarkupContainer("parent"); 

    public WebPage() { 
    parent.add(new Label("content", "hi"); 
    } 
    ... 
    public void nodeSelected(Object node) { 
    log.debug("nodeSelected: " + node+ " class: " + node.getClass()); 
     parent.replaceWith(new Label("content", "Hello World")); 
    } 
    } 
} 
+0

嗯。節點選擇從哪裏來? –

+0

對於到您撥打replaceWith行: 「更換部件必須具有相同的ID作爲組件將取代」 所以據我看到的,replaceWith函數應該在你的構造函數初始化新的標籤被稱爲上。 也正如我記得你調用替換後你必須做的:originalLabel = newLabel以及。 無論如何,我使用的檢票6.20,只是爲了確保,我們是在談論同樣的情況。 :) – BlondCode