2012-12-12 40 views
0

我使用Fest來檢查兩個條目是否具有相同的圖標。從JTree獲得JLabel使用(或不)框架

我實際上有一個JTreeFixture,從我可以訪問特定條目的路徑。

JTreeFixture tree = getTreeFromWindow(); 
JLabel label = (JLabel) tree.selectPath("/folder2/entry2").component.getCellRenderer(); 

JLabel labe2 = (JLabel) tree.selectPath("/folder2/entry3").component.getCellRenderer(); 

我收到兩個JLabel,但它們都指向我的folder2中的最後一項。 因爲它似乎很難幫助我很多,我打算直接使用JTree(感謝JTreeFixture.component()=>返回JTree),並直接從JTree中提取信息。

如何獲得包含在JTree中的JLabel,知道條目的路徑?

解決: 我建立這個方法:

public Icon getIconeFromPath(String path){ 
    JTreeFixture tree = getTreeFromWindow(); 
    PreMadeCellRenderer renderer = (PreMadeCellRenderer) tree.component().getCellRenderer().; 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.clickPath(path).component().getLastSelectedPathComponent(); 
    JLabel label = (JLabel) renderer.getTreeCellRendererComponent(tree.component(), node, true, true, true, 0, true); 
    return label.getIcon(); 
} 

getTreeFromWindow返回JTreeFixture PreMadeCellRenderer是延伸DefaultTreeCellRenderer getTreeCellRendererComponent返回的成分,它的參數是這裏解釋http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/TreeCellRenderer.html

我使用的渲染參數0,因爲我不知道要放什麼,並且工作:)

回答

1

Swing使用相同的共享JLabel對象來繪製所有樹節點(出於性能原因)。我會建議檢查樹節點的用戶對象(通常是String)。

也看到這一點: Difficulties understanding the renderers mechanism of swing's JTable and JTree

+0

感謝的。我已經讀過UesrObject,並且可以讀取包含在樹中的條目,但是我正在查找樹中顯示的圖標 – Bertrand

+0

圖標也沒有靜態分配給樹節點。你有一個TreeCellRenderer實現的地方,它爲你的節點分配一個Icon,但是這個任務只在樹的繪製過程中發生。 – lbalazscs

+0

是的,我剛剛解決了我的問題,獲取Tree創建中使用的TreeCellRenderer,並使用其參數調用getTreeCellRendererComponent。我從我的圖標中得到了一個JLabel;) – Bertrand