【发布时间】:2012-06-19 00:59:53
【问题描述】:
我正在制作一个经常更新JTree 的模拟器。树中的节点都是JProgressBars。
我正在调用 tree.treeModel.insertNodeInto(,,) 和 treeModel.reload() 来更新树。问题是它会立即更新自己而无需等待repaint() 调用。这会导致树闪烁。我尝试为节点、树和它所在的容器设置setDoubleBuffered(true),但没有任何变化。
这是我的代码:(班级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;
}
}
}
【问题讨论】:
-
也许吧。但我不太关心性能,因为整体更新率足够小。我只想在重新加载时摆脱闪光灯/闪烁。缓冲区应该这样做。但我不知道如何以简单的方式做到这一点。
-
insertNodeInto之后无需再调用reload()。insertNodeInto内部调用fireTreeNodesInserted进而更新树。
标签: java swing rendering jtree double-buffering