Tirar seleção de né filho quando fechar o nó pai

Boa tarde galera!

Gostaria de uma ajudinha de vcs, pois eu não encontrei uma solução ainda para o meu problema.

Tenho uma interface de relatórios em uma JTree, estou querendo que quando eu clique em um
nó filho ele da um print no nome dele e assim que eu fechar a pasta que contem aquele arquivo
ele tire a seleção do nó interno da pasta. Simplesmente quero que quando eu fechar a hierarquia
o nó filho não fique com seleção, pois está dando erro por isso, quando eu seleciono o nó filho ele
printa na tela, quando eu fecho a pasta com ele selecionado da erro, sem ele estar selecionado não dá.

Vou postar os códigos aqui para analise dos amigos:

Classe que monta a JTree com os nós.

[code]package view;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.File;

import java.util.Enumeration;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.SwingConstants;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

public class Relatorios extends JFrame {

private JPanel painelTreeAux = new JPanel(new BorderLayout());
private JPanel painelTree = new JPanel(new BorderLayout());
private JToolBar barBotoes = new JToolBar();
private JButton btnInformaParametros = new JButton();
private JButton btnListaRelatorios = new JButton();
private JButton btnMontaRelatorio = new JButton();
private JButton btnVoltar = new JButton();
private JScrollPane scroll1;
private DefaultMutableTreeNode rootNode;
private JTree tree;
private JSeparator separator;

public Relatorios() {
    init();
}

public void init() {

    this.setTitle("Relatórios");
    this.setIconImage(new ImageIcon(getClass().getResource("/image/ICONE_TITULO.png")).getImage());
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(600, 650);

    this.setLocationRelativeTo(null);
    this.setResizable(false);
    painelTree.setLayout(null);
    painelTree.setSize(600, 650);
    this.add(painelTree);

    barBotoes.setBounds(0, 0, 195, 45);
    barBotoes.setFloatable(false);

    btnInformaParametros.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Informa_Parametros_Selecao.png")));
    btnListaRelatorios.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Lista_Relatorios.png")));
    btnMontaRelatorio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Monta_Relatorio.png")));
    btnVoltar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Voltar.png")));

    barBotoes.add(btnInformaParametros);
    barBotoes.add(btnListaRelatorios);
    barBotoes.add(btnMontaRelatorio);
    barBotoes.add(btnVoltar);

    painelTree.add(barBotoes, BorderLayout.NORTH);

    rootNode = new DefaultMutableTreeNode("Relatórios");
    tree = new JTree(rootNode);

    scroll1 = new JScrollPane(tree);
    scroll1.setBounds(0, 45, 595, 400);
    painelTree.add(scroll1);
    
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.addTreeSelectionListener(new SelectionListener());

    separator = new JSeparator(SwingConstants.HORIZONTAL);
    painelTree.add(separator);
    separator.setBounds(0, 440, 600, 20);

    //Chama o método para popular o JTree
    listAllFiles("C:\\Users\\diego\\Desktop\\Relatorios", rootNode, true); //se forem executar mudar o diretório

    this.setVisible(true);

}

/**
 * @params: String directory - o diretório a trabalhar
 * @params: DefaultMutableTreeNode parent - o node pai
 * @params: Boolean recursive - determina se vai trabalhar com as subpastas, ou só o pai
 */

public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
    // Lista todos os arquivos no diretório "String directory" no array "children"
    File[] children = new File(directory).listFiles();

    for (int i = 0; i < children.length; i++) {

        // Pega o nome de cada Pasta ou Arquivo
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
        // Só mostra o Node se ele é uma pasta e se esta é uma chamada recursiva
        if (children[i].isDirectory() && recursive) {
            parent.add(node); // adiciona como filho
            listAllFiles(children[i].getPath(), node, recursive); // chamada recursiva para trabalhar com o filho
        } else if (!children[i].isDirectory()) { // senão caso não seja um diretório
            parent.add(node); // adiciona como um arquivo

        }
    }
}

public static void main(String[] args) {

    new Relatorios();
}

}
[/code]

Classe de evento que printa cada seleção de nó.

[code]package view;

import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

public class SelectionListener implements TreeSelectionListener {

public void valueChanged(TreeSelectionEvent se) {

    JTree tree = (JTree)se.getSource();
    DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
    String selectedNodeName = selectedNode.toString();

    if (selectedNode.isLeaf()) {

        System.out.println(selectedNodeName);

    }
}

}
[/code]

Quando gera o erro dá um NullPointException

Obrigado a todos.

Coloca o log do erro

Cara, eu acho que com o método

tree.setSelectionPath(tree.getSelectionPath().getParentPath());

você pode conseguir.

Boa tarde Ivan Alves, Obrigado por responder!

Ai vai o log de erro:

C:\Oracle\Middleware\jdk160_24\bin\javaw.exe -client -classpath C:\JDeveloper\mywork\Test_Swing\.adf;C:\JDeveloper\mywork\Test_Swing\ViewController\classes;C:\Oracle\Middleware\modules\javax.servlet_1.0.0.0_2-5.jar;C:\Oracle\Middleware\modules\javax.jsp_1.2.0.0_2-1.jar;C:\Oracle\Middleware\modules\glassfish.el_1.0.0.0_2-1.jar;C:\Oracle\Middleware\oracle_common\modules\oracle.jsf_2.0\jsf-api.jar;C:\Oracle\Middleware\oracle_common\modules\oracle.jsf_2.0\jsf-impl.jar;C:\Oracle\Middleware\modules\glassfish.jstl_1.2.0.1.jar;C:\JDeveloper\mywork\Test_Swing\ViewController\lib\swing-layout-1.0.jar;C:\JDeveloper\mywork\Test_Swing\ViewController\lib\swingx-2006_10_27.jar -Djavax.net.ssl.trustStore=C:\Users\diego\AppData\Local\Temp\trustStore72542014623744150.jks -Dhttp.proxyHost=190.0.1.236 -Dhttp.proxyPort=80 -Dhttp.nonProxyHosts=localhost|localhost.localdomain|127.0.0.1|::1|GM109.GEMPI.LOCAL|GM109 -Dhttps.proxyHost=190.0.1.236 -Dhttps.proxyPort=80 view.Relatorios reportClassificacaoDeLotesPorEstacao.jspx reportClassificacaoDeLotesPorLocalidade.jspx reportClassificacaoDeLotesPorSecaoServico.jspx Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at view.SelectionListener.valueChanged(SelectionListener.java:15) at javax.swing.JTree.fireValueChanged(JTree.java:2820) at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3191) at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629) at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078) at javax.swing.tree.DefaultTreeSelectionModel.removeSelectionPaths(DefaultTreeSelectionModel.java:497) at javax.swing.JTree.removeDescendantSelectedPaths(JTree.java:3516) at javax.swing.JTree.setExpandedState(JTree.java:3404) at javax.swing.JTree.collapsePath(JTree.java:2188) at javax.swing.plaf.basic.BasicTreeUI.toggleExpandState(BasicTreeUI.java:2215) at javax.swing.plaf.basic.BasicTreeUI.handleExpandControlClick(BasicTreeUI.java:2191) at javax.swing.plaf.basic.BasicTreeUI.checkForClickInExpandControl(BasicTreeUI.java:2149) at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3511) at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3459) at java.awt.Component.processMouseEvent(Component.java:6286) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6054) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4652) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) at java.awt.EventQueue.access$000(EventQueue.java:85) at java.awt.EventQueue$1.run(EventQueue.java:603) at java.awt.EventQueue$1.run(EventQueue.java:601) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:617) at java.awt.EventQueue$2.run(EventQueue.java:615) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) Process exited with exit code 0.

[quote=bobleujr]Cara, eu acho que com o método

tree.setSelectionPath(tree.getSelectionPath().getParentPath());

você pode conseguir.[/quote]

Boa tarde bobleujr, valew por responder.

Legal cara eu vou tentar aqui, vou fazer uns testes e já te dou o feedback se funcionou.

[quote=bobleujr]Cara, eu acho que com o método

tree.setSelectionPath(tree.getSelectionPath().getParentPath());

você pode conseguir.[/quote]

É bobleujr não funcionou cara, quando coloco essa linha lá valueChange ele não permite que eu abra a árvore
sendo assim quando clico no rootNode ele dá erro.

Uma pergunta tem um lugar especifico que tem que colocar essa linha, pois as vezes eu posso ter errado, porque não sou
tão conhecedor assim em JAVA e nessa JTree também não.

Segue erro:

C:\Oracle\Middleware\jdk160_24\bin\javaw.exe -client -classpath C:\JDeveloper\mywork\Test_Swing\.adf;C:\JDeveloper\mywork\Test_Swing\ViewController\classes;C:\Oracle\Middleware\modules\javax.servlet_1.0.0.0_2-5.jar;C:\Oracle\Middleware\modules\javax.jsp_1.2.0.0_2-1.jar;C:\Oracle\Middleware\modules\glassfish.el_1.0.0.0_2-1.jar;C:\Oracle\Middleware\oracle_common\modules\oracle.jsf_2.0\jsf-api.jar;C:\Oracle\Middleware\oracle_common\modules\oracle.jsf_2.0\jsf-impl.jar;C:\Oracle\Middleware\modules\glassfish.jstl_1.2.0.1.jar;C:\JDeveloper\mywork\Test_Swing\ViewController\lib\swing-layout-1.0.jar;C:\JDeveloper\mywork\Test_Swing\ViewController\lib\swingx-2006_10_27.jar -Djavax.net.ssl.trustStore=C:\Users\diego\AppData\Local\Temp\trustStore72542014623744150.jks -Dhttp.proxyHost=190.0.1.236 -Dhttp.proxyPort=80 -Dhttp.nonProxyHosts=localhost|localhost.localdomain|127.0.0.1|::1|GM109.GEMPI.LOCAL|GM109 -Dhttps.proxyHost=190.0.1.236 -Dhttps.proxyPort=80 view.Relatorios Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at view.SelectionListener.valueChanged(SelectionListener.java:14) at javax.swing.JTree.fireValueChanged(JTree.java:2820) at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3191) at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629) at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078) at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:287) at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:165) at javax.swing.JTree.setSelectionPath(JTree.java:1598) at view.SelectionListener.valueChanged(SelectionListener.java:14) at javax.swing.JTree.fireValueChanged(JTree.java:2820) at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3191) at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629) at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078) at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:287) at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:170) at javax.swing.JTree.setSelectionPath(JTree.java:1598) at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2311) at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3520) at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3459) at java.awt.Component.processMouseEvent(Component.java:6286) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6054) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4652) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4235) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) at java.awt.EventQueue.access$000(EventQueue.java:85) at java.awt.EventQueue$1.run(EventQueue.java:603) at java.awt.EventQueue$1.run(EventQueue.java:601) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:617) at java.awt.EventQueue$2.run(EventQueue.java:615) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) Process exited with exit code 0.

Obrigado! :thumbup:

Então pessoal não sei se deu pra me entender ai em cima, o que eu estou precisando é
desselecionar o nó filho quando eu fecho o nó pai, tipo quando eu fechar o nó pai a seleção
saia do nó filho. Tipo um cleanSelection na árvore para tirar a seleção.

Espero ter sido mais claro. Obrigado!