2009-11-18 44 views
0

在我的程序中,我有2個JTrees,並且都有一個共同的treeselection監聽器。當我在第一個樹中選擇一個節點,然後立即在第二個樹中選擇一個節點時,問題就會發生。現在,如果我回去選擇第一個樹中最初選擇的同一個節點,則什麼都不會發生。我該如何解決這個問題?有沒有辦法在valueChanged事件處理程序的末尾取消選擇節點?樹選擇的Java問題

編輯後:

現在,如果我只能做

 if (tree == tree1){ 

     if(!tree2.isSelectionEmpty()){ 

      tree2.clearSelection(); 

     } 

    } else { 

     if(!tree1.isSelectionEmpty()){ 

      tree1.clearSelection(); 
     } 

    } 

我第一次選擇它工作正常的樹。但第二次,如果我從另一棵樹中選擇,偵聽器會被觸發兩次,我必須雙擊才能選中它。任何線索爲什麼?

回答

1

Swing在失去焦點時不會清除JTree(或JTable,JList等)的選擇。你需要自己定義這個邏輯。因此,在您的示例中,返回並選擇第一個樹中的節點不起作用,因爲它已被選中。

下面是一個示例TreeSelectionListener的實現,當在另一個選擇上進行選擇時,將清除一個JTree的選擇。

public static class SelectionMaintainer implements TreeSelectionListener { 
    private final JTree tree1; 
    private final JTree tree2; 

    private boolean changing; 

    public SelectionMaintainer(JTree tree1, JTree tree2) { 
    this.tree1 = tree1; 
    this.tree2 = tree2; 
    } 

    public valueChanged(TreeSelectionEvent e) { 
    // Use boolean flag to guard against infinite loop caused by performing 
    // a selection change in this method (resulting in another selection 
    // event being fired). 
    if (!changing) { 
     changing = true; 
     try { 
     if (e.getSource == tree1) { 
      tree2.clearSelection(); 
     } else { 
      tree1.clearSelection(); 
     } 
     } finally { 
     changing = false; 
     } 
    } 
    } 
} 
+1

你是機器人嗎? ......這真快! – Thimmayya 2009-11-18 09:03:36

+0

它的工作,但當我從一棵樹切換到另一棵樹進行選擇時,我需要在突出顯示前雙擊該節點。 (雖然第一次點擊該節點確實會觸發我正在尋找的動作,但它只是在第二次點擊之後才突出顯示節點。這是你的代碼應該採取的預期過程? – Goutham 2009-11-20 10:29:52