JTree seleccione el nodo haciendo clic en cualquier lugar de la fila

Tengo codigo tomado de aquí eso permitiría la selección de una fila JTree haciendo clic en cualquier lugar de la fila. funciona bien en el modo de selección de una sola fila. Sin embargo, no estoy seguro de cómo modificarlo para manejar selecciones de filas múltiples. ¿Cómo distingo el caso cuando el usuario realiza una selección múltiple (por ejemplo, manteniendo presionado el botón de cambio o control mientras hace clic con el botón izquierdo del mouse en una fila)?

importar java.awt.Rectángulo; importar java.awt.event.MouseAdapter; importar java.awt.event.MouseEvent; importar java.awt.event.MouseListener; importar javax.swing.JFrame; importar javax.swing.JTree; importar javax.swing.SwingUtilities; importar javax.swing.tree.DefaultMutableTreeNode; importar javax.swing.tree.TreeNode; @SuppressWarnings("serial") public class NavTree extiende JTree { private boolean fWholeRowSelectionEnabled; privado MouseListener fRowSelectionListener; Árbol de navegación final fThis; public NavTree(TreeNode rootNode) { super(rootNode); fEsto = esto; en eso(); } public NavTree() { fEsto = esto; en eso(); } private void init() { //setCellRenderer(new NavTreeCellRenderer()); fRowSelectionListener = new MouseAdapter() { public void mousePressed(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { int la fila más cercana = fThis.getClosestRowForLocation( e.getX(), e.getY()); Rectángulo LímitesFilaMás Cercano = fThis.getRowBounds(FilaMásCerca); if(e.getY() >= LímitesFilasMás Cercanos.getY() && e.getY() < LímitesFilasMás Cercanos.getY() + LímitesFilasMás Cercanos.obtenerAltura()) { if(e.getX() > LímitesFilasMás Cercanos.getX() && FilaMáscercano < fThis.getRowCount()){ fThis.setSelectionRow(closestRow); } } más fThis.setSelectionRow(-1); } } }; setWholeRowSelectionEnabled(verdadero); } public void setWholeRowSelectionEnabled(boolean wholeRowSelectionEnabled) { fWholeRowSelectionEnabled = wholeRowSelectionEnabled; if (fWholeRowSelectionEnabled) addMouseListener(fRowSelectionListener); else removeMouseListener(fRowSelectionListener); } public boolean isWholeRowSelectionEnabled() { return fWholeRowSelectionEnabled; } public static void main(String[] args) { JFrame frame = new JFrame(); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Raíz"); root.add(nuevo DefaultMutableTreeNode("Niño 1")); root.add(nuevo DefaultMutableTreeNode("Niño 2")); root.add(nuevo DefaultMutableTreeNode("Niño 3")); NavTree árbol = new NavTree(raíz); marco.añadir(árbol); cuadro.setSize(200, 300); marco.setVisible(verdadero); } }

preguntado el 06 de junio de 12 a las 01:06

2 Respuestas

Utilice la información de la tecla modificadora del MouseEvent. Vea MouseEvent#getModifiersEx para obtener más información.

Respondido el 06 de junio de 12 a las 07:06

gracias, pero depende un poco de la plataforma, ¿hay alguna forma mejor? - user881480

Solo depende de la plataforma en el sentido de que requiere una plataforma con un teclado... - Tharwen

PD: el registro del oyente contiene un error

public void setWholeRowSelectionEnabled(boolean wholeRowSelectionEnabled) {
    fWholeRowSelectionEnabled = wholeRowSelectionEnabled;
    if (fWholeRowSelectionEnabled)
        addMouseListener(fRowSelectionListener);
    else
        removeMouseListener(fRowSelectionListener);
}

Establecer la propiedad wholeRowSelectionEnabled a true debe registrar al oyente una sola vez. Su código agregaría el oyente una y otra vez si la propiedad se establece en true varias veces. Lo que quiero decir es que el setter de la propiedad debe ser idempotente.

Una solución rápida podría ser eliminarlo primero y agregarlo si está habilitado

public void setWholeRowSelectionEnabled(boolean wholeRowSelectionEnabled) {
    removeMouseListener(fRowSelectionListener);
    fWholeRowSelectionEnabled = wholeRowSelectionEnabled;
    if (fWholeRowSelectionEnabled)
        addMouseListener(fRowSelectionListener);
}

contestado el 23 de mayo de 17 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.