2015-03-07 4 views
0

У меня есть JTree, который показывает файлы и папки, я хотел бы иметь доступ к узлам, чтобы они были включены или отключены. Например, если кнопка нажата или когда их текст равен определенному тексту, отключите их.Как отключить лист JTree

Вот мой основной класс:

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); 


     traverse(tree, "DS.png"); 

     frame.add(panel); 
     frame.setSize(600, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
     new FileViewer(); 
} 

Я мог бы сделать траверс метода, проверить каждый ребенок модели и найти конкретный ребенок:

public void traverse(JTree tree, String word) { 
    TreeModel model = tree.getModel(); 
    if (model != null) { 
     Object root = model.getRoot(); 
     //System.out.println("THIS IS ROOOT >>>>>> " + root.toString()); 
     walk(model, root, word);  
     } 
    else 
     System.out.println("Tree is empty."); 
    } 
    protected void walk(TreeModel model, Object o, String word){ 
    int cc; 
    cc = model.getChildCount(o); 
    for(int i=0; i < cc; i++) { 
     Object child = model.getChild(o, i); 
     if (model.isLeaf(child) && child.toString().equals(word)){ 
     System.out.println(child.toString()); 
     } 
     else { 
     //System.out.println("--" + child.toString()); 
     walk(model,child, word); 
     } 
    } 
} 

JTree имеет метод setEnabled(Boolean), но его узлов нет. Есть ли идея, как отключить узлы? Это мой файл FileSystemModel, если вы хотите узнать об этом.

ответ

2

Вы должны создать собственный класс DefaultTreeCellRenderer и использовать его setEnabled метод.

enter image description here

package com.company; 

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreeNode; 
import java.awt.*; 

public class Main { 

    public static void main(String[] args) { 
     TreeNode treeNode = new DefaultMutableTreeNode("Test"); 

     JTree tree = new JTree(); 
     tree.setModel(new DefaultTreeModel(treeNode)); 
     tree.setCellRenderer(new CustomDefaultTreeCellRenderer()); 

     JFrame frame = new JFrame(); 
     frame.setContentPane(tree); 
     frame.setSize(320, 200); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    static class CustomDefaultTreeCellRenderer extends DefaultTreeCellRenderer { 
     @Override 
     public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
      boolean enabled = false; // <-- here is your logic for enable/disable cell 

      sel = enabled; 
      hasFocus = enabled; 

      Component treeCellRendererComponent = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
      treeCellRendererComponent.setEnabled(enabled); 

      return treeCellRendererComponent; 
     } 
    } 
} 
+0

Спасибо. он выполняет свою работу. Только на одном этом. Есть ли у вас мысли о том, как отключить внутренние файлы, если отключенный элемент является папкой? – Dan

+1

Вы можете создать пользовательскую модель данных и пометить элементы файловой системы как включенные/отключенные внутри нее. Затем вы можете использовать эту информацию в 'getTreeCellRendererComponent' для включения/выключения элементов дерева. –

+0

Спасибо за ответ еще раз. Я просто не понимаю, как 'enabled' может работать извне класса' CustomDefaultTreeCellRenderer'. Допустим, я выбрал узел с помощью метода 'walk', и я хочу отключить его. Я попытался сделать метод, но он не сработал. Можете ли вы привести мне пример для этого, пожалуйста? – Dan

Смежные вопросы