Deseleccionar nodo de JTree cuando se haga clic en cualquier lugar fuera del árbol

daniel lozano :

Estoy utilizando una JTree, que está usando una DefaultTreeModel. Este modelo de árbol tiene algunos nodos en el interior, y cuando hago clic en un nodo, tengo la información del nodo y se cambia el color de fondo para mostrar que se ha seleccionado este nodo.

Es posible llamar el árbol para borrar la selección al hacer clic en cualquier lugar fuera del árbol? En la limpieza de la selección voy a ser capaz de cambiar el color de fondo de nuevo, pero no sé cómo o dónde utilizar el clearSelection()método del árbol al hacer clic fuera del árbol.

Aquí está el código que estoy utilizando:

El ejemplo:

import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;

public class JTreeSelectDeselect {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel(new BorderLayout());
        JTree tree = new JTree();
        tree.setCellRenderer(new DeselectTreeCellRenderer());

        panel.add(tree, BorderLayout.LINE_START);
        panel.add(new JScrollPane(new JTextArea(10, 30)));
        frame.add(panel);

        frame.pack();
        frame.setVisible(true);
    }
}

class DeselectTreeCellRenderer extends DefaultTreeCellRenderer {

    @Override
    public Color getBackgroundSelectionColor() {
        return new Color(86, 92, 160);
    }

    @Override
    public Color getBackground() {
        return (null);
    }

    @Override
    public Color getBackgroundNonSelectionColor() {
        return new Color(23, 27, 36);
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);

        setForeground(new Color(225, 225, 221, 255));
        setOpaque(false);

        return this;
    }
}

Estoy mostrando aquí cómo creo los nodos y añadir al árbol usando un modelo de árbol y cómo puedo configurar mi costumbre TreeCellRenderer.

En el procesador de celdas pinto el nodo seleccionado con un color específico, y si no está seleccionado el nodo, lo pinto utilizando otro color. Cuando cambio la selección de los nodos, su origen es la pintura correctamente, pero cuando hago clic fuera del árbol, el nodo seleccionado no está seleccionada, por lo que no se pinta con el color específico establecido en el procesador de celdas.

Hay una manera de anular la selección del nodo al hacer clic fuera del árbol?

Y sólo si alguien sabe, hay una manera de cambiar algunas de las hojas de las casillas de verificación de la TreeCellRenderer? Tener algunos niños como etiquetas y algunos otros como casillas de verificación. Porque cuando intento agregar casillas de verificación que dice (como yo esperaba) que casillas de verificación no son DefaultMutableTreeNodeobjetos y no puedo agregarlos al modelo de árbol.

John M:

Primero de todo lo que no es necesario subclase el DefaultTreeCellRenderer si sólo desea cambiar algunos colores. Puede crear una nueva, fije los colores a su gusto y configurarlo para el árbol. En el ejemplo de código que he hecho esto en el getDefaultTreeCellRenderer ().

Su panel contiene dos elementos del árbol y el área de texto. Para conseguir lo que necesitaba he añadido un detector de ratón y un oyente foco al árbol:

  • El ratón Listener - en mouseClicked () se activa tanto cuando se hace clic en el interior del árbol o fuera de ella (pero no en el TextArea, para eso tenemos el oyente enfoque). Para comprobar si ha hecho clic en los límites de una célula usamos el tree.getRowForLocation (e.getX (), e.getY ()) y si se devuelve -1 Esto significa que se hace clic fuera de cualquier célula que podamos borrar la selección
  • El Focus Listener - cuando se pierde el foco desde el JTree y haga clic en el área de texto este se activará y acabamos de borrar la selección

Necesitábamos ambos oyentes porque el primero se activa sólo cuando se hace clic en el árbol y alrededor de ella, pero no es el área de texto y el segundo se desencadena cuando uno se concentra fuera del área de árbol y se centran en el área de texto.

import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class JTreeSelectDeselect {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        JPanel panel = new JPanel(new BorderLayout());
        JTree tree = new JTree();

        tree.setCellRenderer(getDefaultTreeCellRenderer());
        tree.addMouseListener(getMouseListener(tree));
        tree.addFocusListener(getFocusListener(tree));

        panel.add(tree, BorderLayout.LINE_START);
        panel.add(new JScrollPane(new JTextArea(10, 30)));
        frame.add(panel);

        frame.pack();
        frame.setVisible(true);
    }

    private static DefaultTreeCellRenderer getDefaultTreeCellRenderer() {
        DefaultTreeCellRenderer defaultTreeCellRenderer = new DefaultTreeCellRenderer();
        defaultTreeCellRenderer.setBackgroundSelectionColor(new Color(86, 92, 160));
        defaultTreeCellRenderer.setBackgroundNonSelectionColor(new Color(135, 151, 53));
        defaultTreeCellRenderer.setBackground(new Color(225, 225, 221, 255));
        defaultTreeCellRenderer.setForeground(new Color(225, 225, 221, 255));
        return defaultTreeCellRenderer;
    }

    private static FocusListener getFocusListener(final JTree tree) {
        return new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {

            }

            @Override
            public void focusLost(FocusEvent e) {
                System.out.println("focus lost");
                tree.clearSelection();
            }
        };
    }

    private static MouseListener getMouseListener(final JTree tree) {
        return new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("mouse clicked");
                if(tree.getRowForLocation(e.getX(),e.getY()) == -1) {
                    System.out.println("clicked outside a specific cell");
                    tree.clearSelection();
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {

            }

            @Override
            public void mouseReleased(MouseEvent e) {

            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

            @Override
            public void mouseExited(MouseEvent e) {

            }
        };
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=167900&siteId=1
Recomendado
Clasificación