2013-03-01 78 views
1

我有一個JTree與幾個節點,並且每個節點都有一個不同的關聯JPanel我想要顯示給用戶。我已經使用了一個自定義的TreeCellRenderer,而且我的代碼目前正常工作,但是(我認爲)它有點過於笨拙,我對此有所擔心如何根據JTree選擇優化顯示不同的JPanel

1)如果我只保留一個選定的樹節點,將不斷刷新JPanel。一旦選定的節點顯示了JPanel一次,我不希望它再次被選中,除非另一個節點被選中。 2)如果用戶在我的定時器運行node1時選擇了不同的節點(我們說節點2),我不想打擾顯示node1的JPanel,因爲用戶已經離開它。

這裏是我的興趣代碼:

Component ret = super.getTreeCellRendererComponent(tree, value, 
      selected, expanded, leaf, row, hasFocus); 

    DefaultMutableTreeNode entry = (DefaultMutableTreeNode)value; 


    // if the node is selected 
    if(sel) 
    { 
// set the background of the node 
     setBackgroundNonSelectionColor(new Color(0x91, 0xC5, 0xFF)); 
// display the JPanel for the node 
     displayPanel(entry); 
    } 
    else 
    { 
// if the node isn't selected then no background selection color 
     setBackgroundNonSelectionColor(Color.WHITE); 
    } 


    return ret; 

displayPanel功能:

// display the node's JPanel after sleeping for 1s 
private void displayPanel(final DefaultMutableTreeNode entry) 
{ 
    Thread thr = new Thread(){ 

     public void run(){ 

       // sleep for 1000ms 
        CF.sleep("1000"); 

// display the panel for this node 
        CF.displayPanel(entry); 
      } 
      }; 
    thr.start(); 
} 

說實話,DefaultTreeCellRenderer還是有點混亂給我。我會很感激任何有關如何有效地運行的建議。

+0

第一段代碼的上下文不是很清楚,它包含在哪裏?另外,爲什麼不僅僅使用樹選擇事件來選擇'JPanel'來顯示? – asermax 2013-03-01 18:53:44

+0

對不起,代碼位於擴展DefaultTreeCellRenderer的類中。如果您想要更多的上下文,我可以包含其餘的代碼。我沒有考慮使用樹選擇事件,因爲我目前沒有在那裏聽一個動作,但這可能是一個更好的主意。 – Matt 2013-03-01 18:56:32

回答

2

也許我在這裏錯過了一些東西,但是不能在樹上使用Tree Selection偵聽器嗎?

tree = new JTree(treeModel); 
tree.addTreeSelectionListener(new TreeSelectionListener() {  
    public void valueChanged(TreeSelectionEvent arg0) { 
     //Code here to get selection and display panel 
    } 
}); 
+0

是的,我推翻了這一點,並使其過於複雜。將在5分鐘內接受你的答案。謝謝 – Matt 2013-03-01 18:57:34

+0

JTree不接受ActionListener – 2013-03-01 18:59:56

+0

錯誤類型,TreeSelectionListener,代碼是正確的。 – 2013-03-01 19:01:11

1

TreeCellRenderer是爲了「渲染」的目的。什麼是給定對象的表示?它是一個標籤嗎?它是一個複選框嗎?更復雜的東西?基本上它用於在顯示器上「打印」JTree的每個節點的表示。在不可預測的時刻,渲染可能會發生很多次,因此不適合傾聽選擇。

你所尋找的是一個TreeSelectionListener其必須實現一個方法,並且將被觸發每次的JTree的變化選擇。

將您的聽衆添加到javax.swing.JTree.getSelectionModel().addTreeSelectionListener()

final JTree tree = ...; 
tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { 
    public void valueChanged(TreeSelectionEvent e) { 
     if (tree.getSelectionPath()!=null) 
      displayPanel((DefaultMutableTreeNode) tree.getSelectionPath().getLastPathComponent()); 
    } 
}); 
+0

嗨Guillaume,我不確定你是否可以在StackOverflow上發送消息,但是感謝你指導我調用invokeLater,而不僅僅是低估了我。我目前從我的程序中更新我的GUI,而不使用invokeLater。我將確保解析我的代碼並進行更新。 – Matt 2013-03-01 19:43:31