Problema com JTree (árvore de diretório)

0 respostas
B

Ola pessoal,

Tenho uma JTree que é uma arvore de diretorio em um JPanel, e no JPanel de baixo quero mostrar os arquivos daquele diretorio selecionado no panel de cima. Já tentei fazê-lo de mil formas mas não consegui, em outro fórum me sugeriram criar outra arvore no panel de baixo, apenas mostrando os arquivos. Estou tentando fazer mas nao estou conseguindo, estou criando a arvore no método que trata eventos da arvore de cima (a dos diretorios).

Segue a imagem:

Abaixo passo o código:

public class GUIRainfallGauges extends JFrame implements TreeSelectionListener{ 
	
	private static final long serialVersionUID = 1L;

	private JTree tree;
	private JTree treeFiles;
	
	DefaultTreeCellRenderer renderer;
	
	private JPanel panelButtons;
	private JPanel panelLeft;
	private JScrollPane panelDir;
	private JScrollPane panelFiles;
	
	private JButton btnImportExportArray10;
	private JButton btnImportExportArray20;
	private JButton btnExportData;
	private JButton btnChart;
	private JButton btnClose;
	private JButton btnOneGauge;
	private JButton btnAllGauges;
	
	private JFileChooser chooser;
	
	private JTable tblRainfallGaugesData;
	
	private ArrayList<ACM_Gauge> gauges;
	
	private BEER beer;
	
    static {JFrame.setDefaultLookAndFeelDecorated(true);}
	
	public GUIRainfallGauges(BEER beer){
		super("Rainfall gauges");
		
		if (beer != null){
			this.beer = beer;
			if (this.beer.getWatershed().getRainfallGauges().size() != 0)
				this.gauges = beer.getWatershed().getRainfallGauges();			
		}
		this.createAndShowGUI();
		
		this.createFileChooser();

		this.pack(); 
		this.setVisible(true); 
	} 
				
	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.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);

    	this.renderer = (DefaultTreeCellRenderer)this.tree.getCellRenderer();
    	this.renderer.setLeafIcon(this.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.panelLeft.add(splitPane);
    	
    	this.add(this.panelLeft);
	}
	

	private void formatPanelTreeFiles() {
		this.panelFiles = new JScrollPane();
    	this.panelFiles.setBorder(new EtchedBorder());
//    	this.panelFiles.setBackground(Color.WHITE);
    	
    	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/Java/"));
		
		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]);
		}
	}
	
	private void formatPanelButtons(){...}

	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;
		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++) {
//			System.out.println(onlyFiles[i].getName());
//		}
		
		for (int i = 0; i < onlyFiles.length; i++) {
			if(onlyFiles[i].isDirectory());
			else{
				DefaultMutableTreeNode child = new DefaultMutableTreeNode(onlyFiles[i]);
				node.add(child);
			}
		}
		
		tree = new JTree(node);
		return tree;	
	}
}

Tá rolando uma exceção java.lang.NullPointerException no método buildTreeFiles na linha que tem:

if(onlyFiles[i].isDirectory());

Eu acho que é porque não devo fazer isto no método que trata o evento, mas eu sinceramente não sei onde devo fazê-lo, já que eu quero que liste na arvore de baixo apenas os arquivos do diretorios selecionados da arvore de cima. :sad:

Espero que possam me ajudar :slight_smile:

[]'s [/i]

Criado 24 de abril de 2007
Respostas 0
Participantes 1