2012-08-28 52 views
7

El comportamiento predeterminado de JTable es cambiar el foco a la celda siguiente y quiero forzarlo a mover el foco al siguiente componente (por ejemplo, JTextField) presionando la tecla TAB.
I overrided isCellEditable método de DefaultTableModel para volver siempre es falsa:Cambiar el foco al siguiente componente en JTable usando TAB

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

Pero todavía no cambia el enfoque al siguiente componente!
¿Cómo debo hacer que JTable cambie el enfoque al siguiente componente en lugar de a la celda siguiente?

+0

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

+0

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

Respuesta

5

Si realmente quieres esto, se 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());  

Luego hay 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 el Action subyacente ...

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

(no he probado esto)

El beneficio de este enfoque es habilitar/deshabilitar el comportamiento que necesita sin necesidad de mantener una referencia a la antigua Actions

+0

no .. (15 caracteres) – kleopatra

+0

? KeyboardFocusManager? Iba a mencionar Componet.transferFocusXXX(), pero tenía 4 meses para eructar: ​​P – MadProgrammer

12

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 specilized API disponible para una tarea, el uso que en lugar de rodar su propia), la solución es configurar teclas de recorrido para contener más de ellos:

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

interesante ... – mKorbel

+1

Sí, no sabía nada de esto. – DejanLekic

4

Para restablecer a las asociaciones de teclas estándar (normalmente TAB y SHIFT + TAB), basta con especificar null para la keystrokes parámetro para Component.setFocusTraversalKeys:

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