2010-08-18 625 views

回答

1

您將需要實現TreeCellRenderer的CustomCellRenderer,並將其附加到JTree。

在你的CustomCellRenderer中,你可以放置按鈕和圖標。

JTree tree = new JTree(rootVector); 
TreeCellRenderer renderer = new CustomCellRenderer(); 
tree.setCellRenderer(renderer); 

檢查這個例子:(上面的代碼中引用從這裏)

http://www.java2s.com/Code/Java/Swing-JFC/TreeCellRenderer.htm

1

您可以將TreeCellRenderer添加到您的JTree。該渲染器可以在樹的每個元素上渲染一個圖標。

1

從JTree的Javadoc中:

要使用的JTree顯示化合物節點(例如,同時包含一個圖形圖標和文本節點),子類javax.swing.tree.TreeCellRenderer並使用setCellRenderer通知樹使用它。

複合節點是你想要的。你必須實現單一的方法,這將返回一個Composite對象,在你的情況下,一個包含一個按鈕和一個標籤並排的小面板。

4

鉗,

您是否有這樣的成功?我想要做同樣的事情,並且很難讓JButton響應用戶。設置渲染器讓按鈕顯示順利,但所有鼠標事件都由JTree自己處理,而不是傳遞給我的按鈕。

我終於找到了解決辦法,我想我會在這裏發佈爲他人評論(也許還有更好的辦法嗎?)

除了我的自定義渲染,我還創建了一個擴展DefaultTreeCellEditor中自定義編輯器。我的自定義渲染器通過構造函數傳遞到自定義編輯器中。在編輯器中,我重寫isCellEditable以返回true,並重寫getTreeCellEditorComponent以返回renderer.getTreeCellRendererComponent。這是關鍵。它返回渲染器組件,這樣所有的點擊都會被傳遞到我的自定義渲染器中的面板中,然後我的JButton會正常響應動作事件。

這裏是我的編輯:

public class MyTreeCellEditor extends DefaultTreeCellEditor { 

public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) { 
    super(tree, renderer); 
} 

public Component getTreeCellEditorComponent(JTree tree, Object value, 
     boolean isSelected, boolean expanded, boolean leaf, int row) { 
    return renderer.getTreeCellRendererComponent(tree, value, true, expanded, leaf, row, true); 
} 

public boolean isCellEditable(EventObject anEvent) { 
    return true; // Or make this conditional depending on the node 
} 

}

在你的樹,一定要設置您的自定義編輯器:

myTree.setCellEditor(new MyTreeCellEditor(myTree, (DefaultTreeCellRenderer) myTree.getCellRenderer())); 
+0

+1。 1.5年過去了,這對我們有很大的幫助。謝謝。 – sqram 2012-02-26 20:08:42

+0

+1。我只使用了TreeCellEditor接口,因爲DefaultTreeCellEditor有很多不必要的功能。 – Nulano 2015-08-24 09:29:56

相關問題