Pregunta

Lo que quiero hacer es cuando el usuario termine de editar los datos en la celda de la tabla para mover el foco a otra celda dependiendo de lo que ingresó el usuario, y para convertir esa celda en modo de edición para que el usuario pueda comenzar a escribir inmediatamente sin ninguna acción adicional. De esta forma, el usuario puede centrarse en su trabajo y el software hará el "pensamiento" sobre qué celda se debe editar a continuación.

Tarea simple que no parece tan simple en la vida real ... ¿alguien alguna idea?

¿Fue útil?

Solución

Pruebe este ejemplo.

Debería permitirle navegar a través de la tabla ingresando los valores u, d, l, r para Arriba, Abajo, Izquierda, Derecha.

Espero que esto te dé una idea sobre cómo hacerlo.

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Test extends JFrame {

    private JTable table;
    private TableModel tableModel;

    public Test() {
        tableModel = new DefaultTableModel(5, 5);

        table = new JTable(tableModel);
        table.setColumnSelectionAllowed(true);

        getContentPane().add(table);

        Action handleEnter = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                table.getCellEditor().stopCellEditing(); // store user input
                int row = table.getSelectedRow();
                int col = table.getSelectedColumn();
                String val = String.valueOf(table.getValueAt(row, col)).toLowerCase();
                if (val.equals("u"))
                    --row;
                else if (val.equals("d"))
                    ++row;
                else if (val.equals("l"))
                    --col;
                else if (val.equals("r"))
                    ++col;
                if (     row >= 0 && row < tableModel.getRowCount()
                      && col >= 0 && col < tableModel.getColumnCount()) {
                    table.changeSelection(row, col, false, false);
                    table.editCellAt(row, col);
                }
            }
        };
        // replace action for ENTER, since next row would be selected automatically
        table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "handleEnter");
        table.getActionMap().put("handleEnter", handleEnter);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.setSize(800, 600);
        test.setVisible(true);
    }
}

Otros consejos

Debe agregar un KeyListener a la JTable para obtener todos los caracteres escritos. Después de que el usuario presione Enter , debe verificar la palabra que ha escrito el usuario.

Escriba su propio FocusTraversalPolicy para configurarlo en la Tabla

table.setFocusTraversalPolicy(policy)

El FocusTraversalPolicy describe qué componente obtiene el siguiente foco. Después de esto, puede llamar

FocusManager.getCurrentManager().focusNextComponent();

EDITAR: No probé esto, es solo una idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top