2012-08-10 1 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()); 
      } 
     } 
}); 

편집 : 나는 내가 전화 한 번 일어날 경우에만 나타납니다 추가 할

. 2 번째의 트리상에서 setModel

답변

1

문제점은 Observer 패턴을 사용하여 지속적으로 디스플레이 (예 : JTree를 업데이트())를 호출하는 것이 었습니다. 이것은 그 자체로 문제가되지 않습니다.

그러나 내 업데이트 호출에서는 실제로 기본 모델이 이러한 변경 자체를 처리 할 때 tree.setModel (...)을 계속 사용했습니다. 내 코드를 setModel()을 한 번만 호출하면 모든 것이 완벽하게 작동합니다.