Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > JTree


Автор: snorkee 16.3.2005, 21:14
мне нужно прикрутить к Java Tree функцию mark/unmark folder. Чтоб когда я правой клавишей кликну на символ folder'a иконка у меня заменилась на новую иконку (точно такая же, но с нарисованным на ней крестиком) и путь к этой папке сохранился в переменную и т.д.

У меня есть кусок текста где программа судь по расширению файла или если это директория ставит заданную мной иконку. По идее надо ActionListener к этой иконке прикручивать, я прав? Попробовал кучу всяких способов но всё равно не получилось...

Код

import java.awt.*;
import java.io.*;
import javax.swing.*;
import javax.swing.tree.*;
 
public class Tree extends JPanel {



     static JTree tree;
     private static boolean useSystemLookAndFeel = true;

     static DefaultTreeCellRenderer render;
     
     public Tree() {
      
          super();
          setLayout(new GridLayout());

          try {
            UIManager.setLookAndFeel(
               UIManager.getSystemLookAndFeelClassName());
           } catch (Exception e) {
            System.err.println("Couldn't use system look and feel.");
          }
          
           JScrollPane scrollPane = new JScrollPane();

           add(scrollPane);

        // scrollPane.setSize(900, 900);
     
        
          
           File start = new File("E:\\Archive\\");
           TreeModel model = new DefaultTreeModel(new CreateNode(start));
  
           tree = new JTree(model);
           tree.setCellRenderer(new NodeRenderer());
           tree.setShowsRootHandles(true);

           scrollPane.setViewportView(tree);
          
      }
      
      public static void main(String args[]) {
           
           Tree browse = new Tree();
           JFrame frame = new JFrame();
           frame.getContentPane().add(browse, BorderLayout.CENTER);
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.setSize(300,500);
           frame.setLocationRelativeTo(null);
           frame.setVisible(true);
      }
 }
  
 class CreateNode extends DefaultMutableTreeNode {
   
     CreateNode(File dir){
         super(dir);
         fillChildren(dir);
     }
     void fillChildren(File dir){
         String[] list = dir.list();
         if( list == null ){
             return;
         }
         for(int i=0; i<list.length; ++i){
             File child = new File(dir, list[i]);
            if(child.isDirectory()){
                add(new CreateNode(child));


            }
            if(child.isFile()) {
                 add(new CreateNode(child));      
            }
        }
     }
 }


//-----------------------------------------------------------------------------

// ТА ЧАСТЬ КОДА, где я занимаюсь обработкой того в каких случаях какая иконка будет появляться.

//-----------------------------------------------------------------------------
class NodeRenderer extends DefaultTreeCellRenderer 
{

  private Icon file1 = new ImageIcon("icons/Documents.png");
  private Icon file2 = new ImageIcon("icons/Folder.png");
  private Icon file3 = new ImageIcon("icons/Pencil.png");
  private Icon file4 = new ImageIcon("icons/Music.png");
  private Icon file5 = new ImageIcon("icons/Text.png");
  private Icon file6 = new ImageIcon("icons/Window.png");
  private Icon file7 = new ImageIcon("icons/Movie.png");
  private Icon file8 = new ImageIcon("icons/Earth.png");
 
  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);
     
          DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
          File file = (File) node.getUserObject();
          String name = file.getName();
          setText(name);

          
          if (name.endsWith(".gif")||name.endsWith(".jpg")||name.endsWith(".jpeg")) {
               setIcon(file3);
          } else if (file.isDirectory()) {    
          setIcon(file2);
          } else if (name.endsWith(".mp3")) {
            setIcon(file4);
          }else if (name.endsWith(".txt") || name.endsWith(".doc")) {
            setIcon(file5);
          }else if (name.endsWith(".exe")) {
            setIcon(file6);
          }else if (name.endsWith(".avi")||name.endsWith(".mpg")||name.endsWith(".mpeg")) {
            setIcon(file7);
          }else if (name.endsWith(".htm")||name.endsWith(".html")||name.endsWith(".php")) {
            setIcon(file8);
          }else {
               setIcon(file1);
          }
          return this;
     }
     public NodeRenderer() {
          super();
     }
    
}


Автор: Domestic Cat 17.3.2005, 06:44
RTFM
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTree.html
Код

 // If you are interested in detecting either double-click events or when a user clicks on a node, 
// regardless of whether or not it was selected, we recommend you do the following:

 final JTree tree = ...;

 MouseListener ml = new MouseAdapter() {
     public void mousePressed(MouseEvent e) {
         int selRow = tree.getRowForLocation(e.getX(), e.getY());
         TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
         if(selRow != -1) {
             if(e.getClickCount() == 1) {
                 mySingleClick(selRow, selPath);
             }
             else if(e.getClickCount() == 2) {
                 myDoubleClick(selRow, selPath);
             }
         }
     }
 };
tree.addMouseListener(ml);

smile

Автор: snorkee 17.3.2005, 16:04
ага, я этот код вчера пробовал он у меня эксэпшн кидал, сейчас как раз дорвусь до компа поищу ещё раз в чём ошибка, постараюсь чтоб заработало smile так что больше пока вопросов не имею, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)