Cambie el enfoque al siguiente componente en JTable usando TAB

El comportamiento predeterminado de JTable es cambiar el enfoque a la siguiente celda y quiero obligarlo a mover el enfoque al siguiente componente (por ejemplo, JTextField) al presionar la tecla TAB.
Yo anulaba isCellEditable método de DefaultTableModel para devolver siempre falso:

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

¡Pero todavía no cambia el enfoque al siguiente componente!
como debo hacer JTable ¿Cambiar el enfoque al siguiente componente en lugar de a la siguiente celda?

preguntado el 28 de agosto de 12 a las 08:08

estamos hablando de Focus 1) dentro de JTable entre celdas 2) moviendo el foco de JTable a (por ejemplo) JTextField y viceversa -

@mKorbel: #2, el comportamiento predeterminado de JTable es cambiar el enfoque a la siguiente celda y quiero obligarlo a mover el enfoque al siguiente componente (p. ej. JTextField) en la tecla TAB presionada. -

4 Respuestas

Las teclas shift-/tabulador se utilizan de forma predeterminada para transferir el enfoque entre los componentes. JTable solicita explícitamente manejar shift-/tab internamente (al proporcionar conjuntos de focusTraversalKeys que no los incluyen).

Siguiendo la regla general (si hay una API específica disponible para una tarea, utilícela en lugar de crear la suya propia), la solución es configurar las claves transversales para que las contengan nuevamente:

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);

respondido 26 nov., 15:09

Sí, no sabía sobre esto. - Dejan Lekic

Si realmente desea esto, debe cambiar el comportamiento predeterminado del mapa de acción de las 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 deshabilitar el subyacente Action...

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

(no he probado esto)

El beneficio de este enfoque es que puede habilitar/deshabilitar el comportamiento según lo necesite sin necesidad de mantener una referencia al antiguo Actions

Respondido 28 ago 12, 09:08

? KeyboardFocusManager? Iba a mencionar Componet.transferFocusXXX(), pero tenía 4 meses para eructar :P - Programador loco

Respondido 28 ago 12, 08:08

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

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

Respondido el 20 de junio de 13 a las 17:06

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