JTree seleccione el nodo haciendo clic en cualquier lugar de la fila
Frecuentes
Visto 1,750 veces
1
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); } }
2 Respuestas
3
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
1
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 java swing jtree or haz tu propia pregunta.
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