2012-06-15 4 views
0

JTree 시뮬레이터를 자주 업데이트하고 있습니다. 트리의 노드는 모두 JProgressBars입니다.JTree를 다시로드하는 중 깜박임

tree.treeModel.insertNodeInto(,,)treeModel.reload()을 호출하여 트리를 업데이트합니다. 문제는 repaint() 호출을 기다리지 않고 즉시 업데이트된다는 것입니다. 이렇게하면 트리가 깜박입니다. 노드, 트리 및 컨테이너가있는 노드에 대해 setDoubleBuffered(true) 설정을 시도했지만 아무 것도 변경되지 않았습니다. 내가 mixing heavy and light components가 깜박이를 일으키는 것으로 의심 (클래스 File extends DefaultMutableTreeNode)

public class FileTree extends JTree { 

    DefaultTreeModel myTreeModel; 

    FileTree(File root) { 
     super(root); 
     myTreeModel = (DefaultTreeModel) this.getModel(); 
     this.treeModel = myTreeModel; 
     this.setCellRenderer(new ProgressBarCellRenderer()); 
     this.setEditable(true); 
    } 

    public void update(File file, File parent) { 
     myTreeModel.insertNodeInto(file, parent, parent.getChildCount()); 
     myTreeModel.reload(); 
    } 

    class ProgressBarCellRenderer extends DefaultTreeCellRenderer { 
     public Component getTreeCellRendererComponent(JTree tree, Object value, 
       boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
      File file = (File) value; 
      JProgressBar progressBar; 
      progressBar = new JProgressBar(0, file.length); 
      progressBar.setValue(file.completed); 
      progressBar.setPreferredSize(new Dimension((int)(Math.log(file.size)*50),10)); 
      return progressBar; 
     } 
    } 

} 
+0

내부

그냥 수 있도록 업데이트가 있습니까 (http://java.sun.com/products/jfc/tsc/articles/mixing/)? 아마도 – trashgod

+0

아마. 하지만 전반적인 업데이트 속도가 충분히 빠르기 때문에 성능에 대해서는별로 신경 쓰지 않습니다. 나는 단지 플래시를 없애기를 원한다./다시로드 할 때 깜박 거린다. 버퍼가이 작업을 수행해야합니다. 그러나 나는 그것을 간단한 방법으로하는 법을 모른다. – akashnil

+1

'insertNodeInto' 다음에'reload()'를 호출 할 필요가 없습니다. 'insertNodeInto'는 내부적으로'fireTreeNodesInserted'를 호출합니다. 그러면 fireTreeNodesInserted가 트리를 업데이트합니다. – tenorsax

답변

0

해결했습니다. 난 그냥 지금 왜 작동하는지 모르겠어요

parent.add(file); 

myTreeModel.insertNodeInto(file, parent, parent.getChildCount()); 

을 변경했습니다. 하지만 그렇습니다. 모든 의견을 높이 평가합니다!

+0

parent.add (file)는 모델 기반 업데이트 논리를 깨뜨립니다. 새 구성 요소를보기에만 추가하고 UI를 수동으로 업데이트해야합니다. – adray

2

:

여기 내 코드입니다. 이 효과는이 example에서 원을 클릭하거나 둘러싸는 프레임의 크기를 조정하여 볼 수 있습니다. 더 나은 지침을 위해 문제를 설명하는 sscce을 포함하도록 질문을 편집하십시오.

+0

sscce에 대한 제안에 감사드립니다. 나는 그랬을거야. 그러나 문제는 지금 해결 되었기 때문에 너무 많은 작업이 필요합니다. – akashnil

0

커스텀 렌더러에서도 같은 문제가 있습니다. 당신 [* 무거운 가벼운 구성 요소 *를 혼합] SwingUtilities.invokeLater

SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      myTreeModel.insertNodeInto(file, parent, parent.getChildCount()); 
     } 
관련 문제