重新加载JTree时闪烁

时间:2012-06-15 23:39:31

标签: java swing rendering jtree double-buffering

我正在制作经常更新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;
        }
    }

}

3 个答案:

答案 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());
        }
相关问题