Mostrar nós de uma JTree em outro painel

7 respostas
brunoneiva

Salve galera,

Tenho uma GUI onde tenho dois JPanel, um cima e outro em baixo. No de cima criei uma arvore de diretórios usando JTree, neste panel deixei a arvore mostrando apenas os diretórios porque preciso que no panel de baixo seja mostrado apenas os arquivos daquele diretório.

Segue a imagem:

Já pensei diversas formas de fazê-lo, já pesquisei também sobre isso, mas não consegui! Não sei como devo adicionar esses “arquivos” (os nomes deles na verdade) no panel de baixo.

Não sei se deu pra entender direito, se precisar posso passar o código aqui.

Espero que vocês possam me ajudar :smiley:

Paz

7 Respostas

dm_thiago

Passe o código, vai facilitar.

[]´s

brunoneiva

Beleza Thiago, ignora os comentários. Fui eu tentando resolver isso, ignora tb as tentativas ae com File, arrayList e etc =D

private void createAndShowGUI() {

		this.setBounds(100, 200, 530, 370);
		this.setPreferredSize(new Dimension(530, 370));
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setLayout(null);
		
		this.formatPanelButtons();
    	this.formatPanelTree();
    	
    	if (this.gauges != null){
    		this.insertDataIntoTable();
    	}
	}

	private void formatPanelTree(){
//    	this.listFiles = new JList();
//    	filesVector = new Vector<File>();
		
		this.panelLeft = new JPanel(new GridLayout(1,0));
    	this.panelLeft.setBackground(this.getBackground());
    	this.panelLeft.setBounds(20, 20, 340, 300);
    	this.panelLeft.setVisible(true);

    	//building tree
    	this.tree = this.buildTreeDirectories();
    	this.tree.setRootVisible(false); 
    	this.tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

    	renderer = (DefaultTreeCellRenderer)this.tree.getCellRenderer();
    	renderer.setLeafIcon(renderer.getDefaultOpenIcon());
    	
    	this.tree.setVisible(true);
    	
    	tree.addTreeSelectionListener(this);
    	
    	this.formatPanelTreeOfDirectories();
    	
    	this.formatPanelTreeFiles();
    	
    	JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    	splitPane.setTopComponent(this.panelDir);
		splitPane.setBottomComponent(this.panelFiles);
    	
		Dimension minimumSize = new Dimension(100,50);
		this.panelDir.setMinimumSize(minimumSize);
		this.panelFiles.setMinimumSize(minimumSize);
		splitPane.setDividerLocation(150);

		splitPane.setPreferredSize(new Dimension(500,300));
		splitPane.setVisible(true);

//		this.panelFiles.add(listFiles);
		
		this.panelLeft.add(splitPane);
    	
    	this.add(this.panelLeft);
    	
	}

	private void formatPanelTreeFiles() {
		this.panelFiles = new JScrollPane();
    	this.panelFiles.setBorder(new EtchedBorder());
//    	this.panelFiles.setBackground(Color.WHITE);
    	

//    	JList listFiles = new JList();
    	
    	if(this.onlyFiles!=null){
    		for(int i=0;i<this.onlyFiles.length;i++){
    			System.out.println(this.onlyFiles[i].getName());
    		}
        	this.panelFiles.add(this.renderer.getComponent(0));
    		
//    		listFiles.setListData(onlyFiles);
    	}

//    	this.panelFiles.add(listFiles);
    
    	this.panelFiles.setVisible(true);
    	
	}

	private void formatPanelTreeOfDirectories() {
		this.panelDir = new JScrollPane(this.tree);
    	this.panelDir.setBorder(new EtchedBorder());
    	this.panelDir.setVisible(true);
	}

	public JTree buildTreeDirectories(){
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("root", true);

		this.getListFiles(root, new File("C:/Arquivos de programas/"));
		
		JTree tree = new JTree(root);
		
		return tree;
	}
	
	private void getListFiles(DefaultMutableTreeNode node, File f) {
		
		if(!f.isDirectory()){
//			DefaultMutableTreeNode childFile = new DefaultMutableTreeNode(f);
//			node.add(childFile);
		}
		else{
			DefaultMutableTreeNode child = new DefaultMutableTreeNode(f);
			node.add(child);
			File fileList[] = f.listFiles();
			for(int i = 0; i  < fileList.length; i++)
				getListFiles(child, fileList[i]);
		}
	}

	public void valueChanged(TreeSelectionEvent e) {
		DefaultMutableTreeNode node = (DefaultMutableTreeNode)
										tree.getLastSelectedPathComponent();

		//fazer com que isso vire global pra que eu pegue de la do metodo de cima os
//		objetos que neste metodo foram construido e os adicione no panel de baixo.
//		aparentemente fácil =D
//		Vector<File> filesVector = new Vector<File>();
		
		if(node==null) return;
		
		
		File fileChild = (File)node.getUserObject();
		
		//cria um array de files contidos naquele icone selecionado
		File[] files =  fileChild.listFiles();
		
//		File[] onlyFiles;
		
	
		
		
		
		int j=0;		

		for(int i=0;i<files.length;i++){
			if(files[i].isFile())
				j++;
		}
		
		this.onlyFiles = new File[j];
		for(int i=0, k=0;i<files.length;i++){
			if(files[i].isFile()){
				this.onlyFiles[k] = new File(files[i].getPath());
				k++;
			}
		}
		
		for(int i=0;i<this.onlyFiles.length;i++){
			System.out.println(this.onlyFiles[i].getName());
		}
		
		
	}

Coloquei apenas os métodos relevantes.
Pra facilitar, caso seja necessário, posso explicar o código :smiley:

Paz

brunoneiva

E em anexo, esta a classe na integra.

davidbuzatto

Vc quer listar os arquivos do diretório no painel abaixo? Cria outra Jtree e popula ela somente com os arquivos não diretórios e voi-lá!

brunoneiva

Eu faço isso no metodo que trata o evento né?

brunoneiva

E ai pessoal, tou aperriado com isso :?

Realmente, nao havia pensado em fazer outra arvore no outro painel. Fiz aqui mas nao parece nada no painel, modifiquei o método que trata o evento. Olha só:

public void valueChanged(TreeSelectionEvent e) {
		DefaultMutableTreeNode node = (DefaultMutableTreeNode)
										tree.getLastSelectedPathComponent();

		if(node==null) return;
		
		File fileChild = (File)node.getUserObject();

		//aqui é a parte em que ele deveria "contruir" o painel de baixo.	
		this.treeFiles = this.buildTreeFiles(node, fileChild);
		this.treeFiles.setRootVisible(true);
		this.treeFiles.setVisible(true);
		this.panelFiles.add(this.treeFiles);
	}

	private JTree buildTreeFiles(DefaultMutableTreeNode node, File dir) {

		int cont=0;
		JTree tree = new JTree(node);
		File[] filesAndDir;
		File[] onlyFiles;

		//armazena em filesAndDir todos os arquivos e diretorios contidos em dir
		filesAndDir = dir.listFiles();
		
		//conta tão somente quantos arquivos contém em filesAndDir
		for (int i = 0; i < filesAndDir.length; i++) 
			if(filesAndDir[i].isFile())
				cont++;
		
		//um array somente com os arquivos contido na pasta dir
		onlyFiles = new File[cont];
		
		for (int i = 0; i < onlyFiles.length; i++) {
			if(onlyFiles[i].isDirectory()){
				
			}
			else{
				DefaultMutableTreeNode child = new DefaultMutableTreeNode(onlyFiles[i]);
				node.add(child);
			}
		}
		return tree;	
	}
}

[]'s

brunoneiva

Na verdade, estava testando agora, tá rolando uma java.lang.NullPointerException no método buildTreeFiles, na linha:

if(filesAndDir[i].isFile())

Acho que o problema está porque não posso contruir esta arvore onde se trata o evento da arvore de cima (a de diretorios), mas realmente não sei outra forma de faze-lo já que na arvore de baixo listo apenas os arquivos da arvore selecionada.

É isso…

Paz

Criado 23 de abril de 2007
Ultima resposta 24 de abr. de 2007
Respostas 7
Participantes 3