JTable Key Bindings
Quiero activar una acción de guardar en cualquier lugar de mi aplicación (Control + S). He añadido el enlace de clave necesario, y la acción se dispara como se esperaba. Sin embargo, si pruebo Control + S en una JTable, la tabla inicia mi acción personalizada y activa la celda de la tabla para editarla. Creo que he deshabilitado la acción de edición en el mapa de entrada de la tabla. ¿Que me estoy perdiendo aqui?
<code>import java.awt.Dimension; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.UIManager; public class TestTableKeyBinding extends JFrame{ JTable table; JScrollPane scroll; public static void main(String[] args){ TestTableKeyBinding test = new TestTableKeyBinding(); test.setVisible(true); } TestTableKeyBinding(){ super(); initUI(); addKeyBindings(); } void initUI(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] headers = new String[]{"apples", "bananas"}; String[][] data = new String[][]{{"1", "2"},{"4","6"}}; table = new JTable(data, headers); table.setCellSelectionEnabled(true); scroll = new JScrollPane(); scroll.setViewportView(table); this.add(scroll); this.pack(); this.setSize(new Dimension(300, 400)); } void addKeyBindings(){ //root maps InputMap im = this.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap am = this.getRootPane().getActionMap(); //add custom action im.put(KeyStroke.getKeyStroke("control S"), "save"); am.put("save", saveAction()); //disable table actions via 'none' table.getInputMap().put(KeyStroke.getKeyStroke("control S"), "none"); table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control S"), "none"); table.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("control S"), "none"); table.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control S"), "none"); ((InputMap)UIManager.get("Table.ancestorInputMap")).put(KeyStroke.getKeyStroke("control S"), "none"); } AbstractAction saveAction(){ AbstractAction save = new AbstractAction(){ public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub JOptionPane.showMessageDialog(TestTableKeyBinding.this.table, "Action Triggered."); } }; return save; } } </code>