como controlar o foco em JTable
-
05-07-2019 - |
Pergunta
O que eu quero fazer é quando acabamento utilizador edição de dados na célula da tabela para mover o foco para outra célula, dependendo do que o usuário entrou, e para transformar a célula em modo de edição assim que o usuário pode começar a digitar imediatamente com nenhuma ação adicional. Este usuário maneira pode se concentrar em seu trabalho e software fará o 'pensamento' sobre qual célula deve ser editado no próximo.
tarefa simples que não parece tão simples na vida real ... Alguém alguma idéia?
Solução
Por favor, tente este exemplo.
Deve permitem navegar através da tabela inserindo os valores u, d, l, r para cima, baixo, esquerda, direita.
A esperança de que isso vai lhe dar uma idéia sobre como fazê-lo.
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);
}
}
Outras dicas
Você deve adicionar um KeyListener ao JTable para obter todos Caracteres digitados. Depois que o usuário pressiona Enter , você deve verificar a palavra que o usuário digitou.
Escreva a sua própria FocusTraversalPolicy
configurá-lo para a tabela
table.setFocusTraversalPolicy(policy)
O FocusTraversalPolicy
descreve qual componente recebe o próximo foco.
Após isso, você pode chamar
FocusManager.getCurrentManager().focusNextComponent();
EDIT:. Eu não testei isso, é apenas uma idéia