2012-08-10 63 views
1

我有一個附帶SelectionListener的JTree。監聽器運行正常,並且每當我單擊樹中的一個節點時都會正確通知我。爲什麼需要兩次點擊來突出顯示我的JTree?

但是,節點在選擇時並不總是突出顯示。實際上,它需要兩次點擊才能顯示節點上的可視「藍色框」。

爲什麼下面的代碼需要兩次點擊來顯示選擇?

創建JTree的

JTree tree = new JTree(); 
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
tree.setDragEnabled(true); 
tree.setDropMode(DropMode.ON); 
tree.expandRow(0); 
tree.setModel(model.getActiveFilterModel()); 

添加監聽器的

tree.addTreeSelectionListener(new TreeSelectionListener() { 
    @Override 
     public void valueChanged(TreeSelectionEvent event) { 
      JTree tree = (JTree) event.getSource(); 
      DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); 
      if (selectedNode != null) { 
       model.setSelectedFilter((Filter) selectedNode.getUserObject()); 
      } 
     } 
}); 

編輯:

我想補充一點,似乎只發生一次我打電話。第二次在樹上的setModel。

回答

1

問題是我正在使用Observer模式並不斷地調用顯示器(例如JTree更新())。這本身不是問題。

但是,在我的更新調用中,我始終在使用tree.setModel(...)來確保底層模型本身處理這些更改。我將代碼切換到只調用一次setModel(),現在一切正常。

相關問題