2011-04-06 39 views

回答

0

我認爲this thread會幫助你,儘管那個提問者似乎是在尋找比你更多的東西。從埃德溫的答覆:

如果忽略populateTreeItem()方法,你可以添加一個AbstractBehaviour到該項目,覆蓋onComponentTag方法。從那裏,你可以做

tag.put("class", "yourValue") 

...

你需要一個AbstractBehaviour添加到每個項目。該組件呈現之前onComponentTag()方法將被運行,所以你可以檢查你的國家的userObject,並添加/刪除使用tag.put()方法:)

而且類,你可能會考慮樹的onNodeLinkClicked()方法,如果你想要在點擊某個項目時執行操作。該onNodeLinkClicked(),您可以訪問到AjaxRequestTarget,所以你也可以執行任意JavaScript代碼,就像這樣:

protected void onNodeLinkClicked(AjaxRequestTarget target, TreeNode node) { 
    MyObject myObject = (MyObject) 
     ((DefaultMutableTreeNode) node).getUserObject(); 
    if (myObject.getMyState()) 
     target.appendJavascript("targetTheComponentWithAJavascriptMethod(" + 
      getId() + ");"); 
} 

要麼,你可以改變userObject的狀態在onNodeLinkClicked方法,並將其添加到AjaxRequestTarget 。然後,您AbstractBehaviour會爲你:)

+0

嗨,感謝您的回覆。我有過這個問題。我之前做過小小的JavaScript,所以我不確定要添加什麼。 – Matthew 2011-04-06 16:17:05

+0

@Matthew,好吧,如果你不想動態改變,你根本不用擔心JavaScript。你可以設置一個枯燥的舊CSS類並完成。但是,從你的問題來看,你實際上試圖做的事情還不清楚。請修改它以使用標籤下的鏈接添加更多詳細信息。 – Pops 2011-04-06 16:22:55

+0

在一個檢票樹中,我試圖在樹的頂部(硬編碼不動)與樹的其餘部分建立不同的顏色。所以頂層節點例如是紅色和斜體。 – Matthew 2011-04-07 07:56:38

0

你想擴展TreeTable,然後覆蓋getCss()改變字體和文字或背景顏色照顧可視化對象的新狀態。如果要更改要覆蓋的實際節點圖標的顏色getNodeIcon()併爲您自己的PNG文件添加資源。

public abstract class MyTreeTable extends TreeTable { 
    private static ResourceReference CSS = new CompressedResourceReference(
     MyTreeTable.class, "TreeTable.css"); 
    private static ResourceReference documentIcon = new CompressedResourceReference(
     MyTreeTable.class, "Icon_Document.png"); 
    private static ResourceReference folderIcon = new CompressedResourceReference(
     MyTreeTable.class, "Icon_Folder.png"); 

    public MyTreeTable(String id, IColumn[] columns) { 
     super(id, columns); 
    } 

    @Override 
    protected ResourceReference getCSS() { 
     return CSS; 
    } 

    @Override 
    protected ResourceReference getNodeIcon(TreeNode node) { 
     if (node.isLeaf() == true) { 
      return documentIcon; 
     } else { 
      return folderIcon; 
     } 
    } 
} 

這個特定組件的CSS是非常挑剔的,因爲他們使用一個單一的圖像和圖像偏移,用於連接樹中的所有行,所以我建議複製他們的整個CSS文件(你可以從源頭上得到它文件),然後調整它。或者,如果您不想進行大量更改,則可能根本不想覆蓋getCSS(),而是在構造函數中添加CSS資源。

真正真正超級跛腳的部分是,TreeTable在每張桌子的頂部插入一個隱形div,所以:first-child僞類不能用於選擇您的物品,或者至少,我似乎無法使其工作。所以你仍然需要重寫populateTreeItem()。喜歡的東西:

boolean first = true; 
@Override 
protected void populateTreeItem(WebMarkupContainer container, int level) { 
    super.populateItem(container, level); 
    if(first) { 
     container.add(new SimpleAttributeModifer("class", "first")); 
     first = false; 
    } 
} 

,然後在你的CSS,

.first {font-color: red; font-style: italic;} 
0

隨着LinkTree(在檢票6.21棄用甚至更早),你可以重寫newNodeComponent方法從頭開始構建組件:

@Override 
protected Component newNodeComponent(String id, IModel<Object> model) 
{ 
    Object node = model.getObject(); 
    if (node instanceof FolderNode) 
    { 
     FolderNode folderNode = (FolderNode)node; 
     return new Label(id, folderNode.getLabel()); 
    } 
    else if (node instanceof FileNode) 
    { 
     ... 
    } 
    else if ... 
    else 
    { 
     return null; 
    } 
} 

注意:原始實現將自動調用LinkTree#onNodeLinkClicked()處理程序構建LinkIconPanel。要保留此功能,您必須在自定義鏈接的處理程序中手動撥打onNodeLinkClicked()