studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java swing focus jtable focusmanager

java - para - manual de programacion android pdf



Cambia el foco al siguiente componente en JTable usando TAB (4)

Las teclas shift / tab se utilizan por defecto para transferir el enfoque entre los componentes. JTable solicita explícitamente manejar el shift- / tab internamente (proporcionando conjuntos de focusTraversalKeys que no los incluye).

Siguiendo la regla general ( si hay api specilized disponible para una tarea, utilícela en lugar de desplegar la suya ), la solución es establecer las claves de cruce para volver a contenerlas:

Set<AWTKeyStroke> forward = new HashSet<AWTKeyStroke>( table.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS)); forward.add(KeyStroke.getKeyStroke("TAB")); table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward); Set<AWTKeyStroke> backward = new HashSet<AWTKeyStroke>( table.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS)); backward.add(KeyStroke.getKeyStroke("shift TAB")); table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward);

El comportamiento predeterminado de JTable es cambiar el enfoque a la celda siguiente y quiero forzarlo a mover el foco al siguiente componente (por ejemplo, JTextField) presionando la tecla TAB.
isCellEditable método isCellEditable de DefaultTableModel para que siempre devuelva false:

public boolean isCellEditable(int rowIndex, int columnIndex) { return false; }

¡Pero aún no cambia el enfoque al siguiente componente!
¿Cómo debo hacer que JTable cambie el enfoque al próximo componente en lugar de a la próxima celda?


Para restablecer los enlaces de teclado estándar (normalmente TAB y MAYÚS + TAB), simplemente especifique null para el parámetro de keystrokes en Component.setFocusTraversalKeys :

table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null); table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);


Si realmente quiere esto, necesita cambiar el comportamiento predeterminado del mapa de acción de tablas.

ActionMap am = table.getActionMap(); am.put("selectPreviousColumnCell", new PreviousFocusHandler()); am.put("selectNextColumnCell", new NextFocusHandler());

Entonces necesitas un par de acciones para manejar el recorrido

public class PreviousFocusHandler extends AbstractAction { public void actionPerformed(ActionEvent evt) { KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.focusPreviousComponent(); } } public class NextFocusHandler extends AbstractAction { public void actionPerformed(ActionEvent evt) { KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.focusNextComponent(); } }

Otro enfoque sería desactivar la Action subyacente ...

ActionMap am = table.getActionMap(); am.get("selectPreviousColumnCell").setEnabled(false); am.get("selectNextColumnCell").setEnabled(false);

(no lo han probado)

El beneficio de este enfoque es habilitar / deshabilitar el comportamiento según lo necesite sin necesidad de mantener una referencia a las Actions