2015-03-07 4 views
1

У меня есть JTree, который показывает файлы и папки каталога. Также есть кнопка, которая отключает некоторые из узлов в JTree (используя DefaultTreeCellRenderer).Как обновить JTree UI

Элемент отключается, когда я нажимаю кнопку, но JTree не показывает его как отключенный элемент. До тех пор, пока я не щелкнул где-нибудь или не включил элементы дерева, он также отобразит отключенный вид элемента.

Я знаю, что существует метод reload() для DefaultTreeModel. Но я использую индивидуальную модель. Так что этот метод не работает. Вот модель, которую я использую, чтобы просмотреть список файлов и папок: 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(); и он отлично работал. Но почему-то я слышал, что обновление пользовательского интерфейса является плохой практикой, так как позже это вызовет другие проблемы. Так использует updateUI correct here? или есть лучший способ сделать обновление UI кликами и взаимодействиями пользователей?

Примечание. Я не буду добавлять или удалять файлы из дерева, мне просто нужно включить/отключить узлы. UPDATE: Я просто замечаю, что есть опция repaint(), которая выполняет аналогичную функцию для меня. Но все-таки, это правильный способ освежить JTree?

ответ

1

repaint() - это правильный API для использования в этой ситуации.