java - 如何刷新 JTree UI

标签 java swing jtree

我有一个 JTree,它显示目录中的文件和文件夹。还有一个按钮可以禁用 JTree 中的某些节点(使用 DefaultTreeCellRenderer)。

当我按下按钮时,该项目被禁用,但 JTree 不会将其显示为禁用项目。直到我单击某处,或者单击树中的项目,它还会显示该项目的禁用外观。

我知道 DefaultTreeModel 有一个 reload() 方法。但我使用的是定制模型。所以这个方法行不通。这是我用来列出文件和文件夹的模型:FileSystemModel

这是我的代码:

public class FileViewer {
    JFrame frame;
    JPanel panel;
    JTree tree;
    File root;
    public ArrayList<String> disabledNodes = new ArrayList<String>();
    public FileViewer(){
        frame = new JFrame("File Viewer");
        panel = new JPanel(new BorderLayout());


        root = new File("D:\\Documents\\A X");
        FileSystemModel model = new FileSystemModel(root);


        tree = new JTree();
        tree.setModel(model);
        panel.add(tree, BorderLayout.CENTER);


        JButton press = new JButton("Press");
        panel.add(press, BorderLayout.SOUTH);
        press.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                disabledNodes.add("folder1");
            }
        });


        tree.setCellRenderer(new CustomDefaultTreeCellRenderer());

        frame.add(panel);
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        new FileViewer();
    }
    class CustomDefaultTreeCellRenderer extends DefaultTreeCellRenderer{

        @Override
        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus){

            super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
            File node = (File)value;
            String name = node.getName();

            for(String element : disabledNodes){

                if(name.equals(element)){
                    this.setEnabled(false);
                }
            }

            return this;

        }
    }
}

但是,在按钮的 ActionListener 中,我添加了 tree.updateUI(); 并且它完美地工作了。但不知何故,我听说更新 UI 是一种不好的做法,因为它会在以后产生其他问题。那么这里使用 updateUI 正确吗?或者有更好的方法让 UI 通过点击和用户交互进行更新?

注意,我不会在树中添加或删除任何文件,我只需启用/禁用节点。 更新:我只是注意到有一个 repaint() 选项可以为我执行类似的功能。但是,这是刷新 JTree 的正确方法吗?

最佳答案

repaint() 是在这种情况下使用的正确 API。

关于java - 如何刷新 JTree UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28919685/

相关文章:

java - 当 JSON 为 null 时尝试从中提取

Java JTextArea 动态列和行编号

java - J树 : modify apperance regardless of L&F

java - 将子节点添加到JTree的父节点

java.lang.NoClassDefFoundError : org/springframework/security/authentication/AuthenticationManager 错误

java - 如何让 JUnit 在超时时保持一致?

java - 等到子线程完成,但不要阻塞主线程

java - 逐列向 JTable 添加数据

java - 从另一个 jframe 添加节点到 jtree

java - Spring Boot 中使用相同存储库和实体的多个数据源