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
el valor predeterminado (
KeyBinding
implementado paraJTable
) es sobre la siguiente celda y de la última celda a la primera,