我正在制作经常更新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;
}
}
}
答案 0 :(得分:2)
我怀疑mixing heavy and light components导致闪烁。通过单击圆圈或调整封闭框架的大小,可以在此example中看到效果。为了获得更好的指导,请修改您的问题以包含展示您描述的问题的sscce。
答案 1 :(得分:0)
我修好了。我刚刚改变了
myTreeModel.insertNodeInto(file, parent, parent.getChildCount());
到
parent.add(file);
我不知道为什么现在有效。但确实如此。任何意见表示赞赏!
答案 2 :(得分:0)
我在自定义渲染器方面遇到了同样的问题。
只需在SwingUtilities.invokeLater
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
myTreeModel.insertNodeInto(file, parent, parent.getChildCount());
}