2012-07-25 45 views
2

在我寫的程序中,我有一個JTree存儲我自己設計的一些對象。我創建了自己的DefaultTreeCellRenderer擴展,並覆蓋了getTreeCellRendererComponent以返回帶有一些按鈕和事物的JPanel。我發現我添加的按鈕並不像按鈕,這使得認爲與組件的交互被樹形單元「偷走」。 (如果您按一下按鈕,也被點擊周圍的按鈕在容器上,和樹都有自己要被點擊響應)Java DefaultMutableTreeNodes:由我的單元格渲染器給出的交互式顯示?

所以我的問題是這樣的:

如果我要的是樹的基本功能,加上一些按鈕,我應該使用什麼方法?

  • 繼續在相同的路線;添加某種鼠標偵聽器以手動將功能添加到按鈕。
  • 繼續在同一條路線上;刪除現有鼠標偵聽器並添加您自己的以實現正確的行爲。
  • 擴展或實現一個稍微不同的類或接口 - 可能不是DefaultMutableTreeNodes,也許不是DefaultTreeCellRenderer等。 - 使用現有的XXXX來完成你想要做的事情。
  • 避免使用JTree;製作你自己的,並不難。

我傾向於最後一個選擇 - 這裏有一個不錯的機會我實際上並不想要一棵樹的摺疊行爲,所以我可以製作自己的結構。但是,即使我選擇了這個選項,我也想知道我應該做什麼。

+2

的建議不要重新發明輪子; - )特別是如果你對現有車輪不滿意的主要原因是你不知道如何改變它。再加上最可能的結果將是一個前衛的結構... – kleopatra 2012-07-25 09:50:08

+0

JTree是Swing API中最複雜的組件之一(除了文本組件),如果工作需要一些時間,不要強調。一旦掌握了它,其他組件看起來就會比較簡單 – MadProgrammer 2012-07-25 16:17:00

回答

3

避免使用JTree;讓你自己的,它並不難

祝你好運機智的;-)

正在發生的事情是,通過渲染器返回的組件只用作「郵票」。所以JTree並不包含返回的組件,它們只是繪製的。因此沒有與你的按鈕交互。它只是看起來像一個按鈕。看起來JTree教程沒有包含這方面的實際部分,但它基本上與表格相同,這在'Renderers and editors' part of the tutorial中進行了解釋。

這也解釋了爲什麼一個典型的渲染器類擴展爲JLabel,並且可以簡單地使用return this在自定義之後,而不影響樹中的其他節點。例如,DefaultTreeCellRenderer的源代碼,它擴展JLabel,包含

public Component getTreeCellRendererComponent(JTree tree, Object value, 
               boolean sel, 
               boolean expanded, 
               boolean leaf, int row, 
               boolean hasFocus) { 
    //... 
    setText(stringValue); 
    //... 
    return this; 
} 

如何解決這個問題:創建一個編輯器中,通過@trashgod

+0

好點。 'Outline',如[此處](http://codereview.stackexchange.com/a/4447/6692)所示,利用相同的模式。 – trashgod 2012-07-25 10:05:31

+0

@trashgod不僅因爲你有所有的例子,現在你將開始填充其他網站。不想知道你花了多少時間在這些例子上 – Robin 2012-07-25 10:11:35