2012-06-20 86 views
0

JTree的某些節點的標籤代表計數器的長度在計數後增加。這會導致縮寫(...)。想象一下,你有一棵樹,每個節點都可以在任何時候改變它的標籤大小。JTree-JLabel更新

樹在一個單獨的線程中每隔100毫秒重新繪製一次(tree.repaint()),以跟蹤更改圖標和更改跟蹤事件和時間進度的標籤。我嘗試了一種方法,在每個樹節點上用一個nodeChanged()調用替換了repaint()方法。樹開始閃爍。

爲了根據新長度更新這些節點標籤,我需要做些什麼? 我已經在擴展一個DefaultTreeCellRenderer。

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
    DefaultMutableTreeNode node; 
    Object     nodeValue; 
    TestComponent   currentComponent; 

    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 

    node  = (DefaultMutableTreeNode) value; 
    nodeValue = node.getUserObject(); 


    if(nodeValue instanceof TestComponent) { 
     currentComponent = (TestComponent) nodeValue; 
     setText(currentComponent.getLabel()); 

    }  
    return this; 
} 

我應該在CellRenderer中做什麼,以便用「setText」「解決」問題?

+1

我需要做什麼---- [Swing and Renderers](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)'JComboBox'的相似概念,'JList','JTable'和'JTree', – mKorbel

+0

我不是在這裏判斷的,也許你是對的,你有可憐的答案(我永遠不會檢查用戶配置文件),但我發佈鏈接渲染器概念,在此處搜索渲染器和PreferredSize – mKorbel

回答

3

樹重新繪製(tree.repaint())中的每一個單獨的線程100ms的,不斷變化的圖標和改變的標籤,其跟蹤事件的進展,並在時間上的結果軌跡

錯誤的,TreeModel應根據跟蹤的事件觸發事件,並且JTree將自動更新。這些變化當然應該在美國東部時間發生,而不是單獨的Thread

不幸的是,JTree的大小(以及包含在其中的標籤的大小)將受包含JTree的父容器限制。當您的JTree的尺寸增加時,此尺寸不會自動增長。

+0

如果將JTree放入JScrollPane中,則JTree的大小將設置爲其preferredSize。 –

+0

@GuillaumePolet的確如此,但這並不能解決可見性問題,因爲您必須水平滾動,這與放大父容器一樣簡單,以便標籤不再被截斷。另一種選擇是選擇多行文本區域,並希望您有足夠的垂直空間 – Robin

+0

實際上我的目的有足夠的空間,但標籤在長度增加時會被切斷。因爲數據和gui是嚴格分離的,所以沒有辦法在沒有附加更新線程的情況下觸發事件... – Schifty