Java 如何刷新JTree用户界面

Java 如何刷新JTree用户界面,java,swing,jtree,Java,Swing,Jtree,我有一个JTree,它显示目录中的文件和文件夹。还有一个按钮,用于禁用JTree中的一些节点(使用DefaultTreeCellRenderer) 当我按下按钮时,该项被禁用,但JTree不会将其显示为禁用项。直到我单击某个地方,或者单击树中的项目,然后它还会显示该项目的禁用外观 我知道DefaultTreeModel有一个reload()方法。但我用的是定制的模型。所以这种方法不起作用。以下是我用于列出文件和文件夹的模型: 这是我的代码: public class FileViewer {

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

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

我知道
DefaultTreeModel
有一个
reload()
方法。但我用的是定制的模型。所以这种方法不起作用。以下是我用于列出文件和文件夹的模型:

这是我的代码:

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;

        }
    }
}
公共类文件查看器{
JFrame框架;
JPanel小组;
JTree树;
文件根目录;
public ArrayList disabledNodes=new ArrayList();
公共文件查看器(){
frame=newjframe(“文件查看器”);
panel=newjpanel(newborderlayout());
root=新文件(“D:\\Documents\\A X”);
FileSystemModel model=新的FileSystemModel(root);
tree=newjtree();
tree.setModel(model);
添加(树、边框布局、中心);
JButton press=新JButton(“press”);
面板。添加(按,边框布局。南);
press.addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
禁用节点。添加(“文件夹1”);
}
});
setCellRenderer(新的CustomDefaultTreeCellRenderer());
框架。添加(面板);
框架。设置尺寸(600600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
新建文件查看器();
}
类CustomDefaultTreeCellRenderer扩展了DefaultTreeCellRenderer{
@凌驾
公共组件GetTreeCellRenderComponent(JTree树、对象值、布尔sel、布尔扩展、布尔叶、int行、布尔hasFocus){
super.gettreeCellrenderComponent(树、值、sel、展开、叶、行、hasFocus);
文件节点=(文件)值;
字符串名称=node.getName();
for(字符串元素:disabledNodes){
if(name.equals(element)){
此.setEnabled(false);
}
}
归还这个;
}
}
}
但是,在按钮的
ActionListener
中,我添加了
tree.updateUI()并且它非常有效。但不知何故,我听说更新UI是一种糟糕的做法,因为它会在以后产生其他问题。那么在这里使用
updateUI
正确吗?或者有更好的方法通过点击和用户交互来更新
UI

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

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