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;
}
}
}
내부
그냥 수 있도록 업데이트가 있습니까 (http://java.sun.com/products/jfc/tsc/articles/mixing/)? 아마도 – trashgod
아마. 하지만 전반적인 업데이트 속도가 충분히 빠르기 때문에 성능에 대해서는별로 신경 쓰지 않습니다. 나는 단지 플래시를 없애기를 원한다./다시로드 할 때 깜박 거린다. 버퍼가이 작업을 수행해야합니다. 그러나 나는 그것을 간단한 방법으로하는 법을 모른다. – akashnil
'insertNodeInto' 다음에'reload()'를 호출 할 필요가 없습니다. 'insertNodeInto'는 내부적으로'fireTreeNodesInserted'를 호출합니다. 그러면 fireTreeNodesInserted가 트리를 업데이트합니다. – tenorsax