2014-04-17 69 views
1

一般而言,我不想要自動選擇摺疊節點。相反,我希望它的子節點保持選擇狀態,以前選擇它。如何在摺疊後不選擇樹節點

在SSCCE下面展開「水果」,然後選擇「香蕉」。現在通過單擊「水果」節點圖標左側的摺疊圖標摺疊「水果」。 「水果」節點崩潰,現在也選中。

我希望「香蕉」節點在「水果」節點摺疊後也保持選中狀態。我怎樣才能做到這一點?

謝謝!

SSCCE:

import javax.swing.JFrame; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TreeExample extends JFrame 
{ 
    private final JTree tree; 

    public TreeExample() 
    { 
     //create the root node 
     final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     //create the child nodes 
     final DefaultMutableTreeNode vegetableNode = new DefaultMutableTreeNode("Vegetables"); 
     final DefaultMutableTreeNode fruitNode = new DefaultMutableTreeNode("Fruits"); 

     final DefaultMutableTreeNode aNode = new DefaultMutableTreeNode("apple"); 
     final DefaultMutableTreeNode bNode = new DefaultMutableTreeNode("banana"); 
     final DefaultMutableTreeNode cNode = new DefaultMutableTreeNode("coconut"); 
     final DefaultMutableTreeNode dNode = new DefaultMutableTreeNode("date"); 

     fruitNode.add(aNode); 
     fruitNode.add(bNode); 
     fruitNode.add(cNode); 
     fruitNode.add(dNode); 

     //add the child nodes to the root node 
     root.add(vegetableNode); 
     root.add(fruitNode); 

     //create the tree by passing in the root node 
     this.tree = new JTree(root); 
     this.add(this.tree); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setTitle("JTree Example"); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public static void main(final String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new TreeExample(); 
      } 
     }); 
    } 
} 
+0

據我所知,唯一可見的節點可以選擇 - 這是在UI委託深跌處理,所以沒有太多機會來改變。如果你真的想要它,你可能需要保留自己的單獨selectionModel並根據需要更新另一個 – kleopatra

+0

我認爲對於SINGLE_TREE_SELECTION,您可以從鼠標事件中選擇丟失展開/摺疊 – mKorbel

+0

@mKorbel我不是母語爲英語的人,但你的句子似乎漏掉了一些東西。 – haferblues

回答

0

因爲看起來它是不可能有選擇的節點,除非它是可見的,我想出了這個解決方案。調試到事件後,我發現當我摺疊一個節點時樹總是「無效」。 所以我重寫JTree中的fireValueChange()。如果樹是「有效的」,我讓價值變化發生。否則,我清除選擇。 如果我不清除選擇,摺疊節點在用戶界面中被選中,這會給人錯誤的印象,因爲它沒有被邏輯選擇。通過清除選擇,可以顯式選擇摺疊節點。 這個解決方案最接近我想要的。唯一缺少的是如果我再次展開先前摺疊的節點,那麼將選擇不可見節點。

到目前爲止,它很適合我:

this.tree = new JTree(this.rootNode) 
    { 
     @Override 
     protected void fireValueChanged(final TreeSelectionEvent e) 
     { 
      if (this.isValid()) 
       super.fireValueChanged(e); 
      else 
      { 
       super.clearSelection(); 
      } 

     } 

    }; 
相關問題