0

我正在制作一个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;
        }
    }

}
4

3 回答 3

2

我怀疑混合重质和轻质成分会导致闪烁。通过单击圆圈或调整封闭框架的大小,可以在此示例中看到效果。为了获得更好的指导,请编辑您的问题以包含一个显示您描述的问题的sscce

于 2012-06-16T00:33:01.627 回答
0

我修好了它。我刚变

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

parent.add(file);

我不知道为什么它现在有效。但确实如此。任何意见表示赞赏!

于 2012-06-22T00:37:50.943 回答
0

我在使用自定义渲染器时遇到了同样的问题。

只需在内部进行更新SwingUtilities.invokeLater

SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            myTreeModel.insertNodeInto(file, parent, parent.getChildCount());
        }
于 2013-07-19T09:34:20.337 回答