мне нужно прикрутить к 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(); } }
|
|