Alguem ai sabe como fazer o jtable só aceitar maiúsculas? Eu consegui fazer no textfield e no combo mas no table ta dificil…
Só uppercase no jtable
7 Respostas
É só alterar o CellEditor da JTable.
Você já chegou a montar seu CellEditor?
Não, ainda não tenho um celleditor. Será que você teria um pronto pra me passar?
Dá uma lida em como isso funciona:
http://www.informit.com/articles/article.aspx?p=333472&seqNum=3
Você já montou o Document para seu JTextField que deixa tudo em maiúscula?
Já peguei um document na net que faz isso, to usando ele no textfield e no combo.
Eu já dei uma olhada em vários sites sobre como funciona mas não to conseguindo adaptar no meu projeto.
O swing não complica as coisas não. Quem acaba se complicando é quem tenta usar sem entender. Vejo todo dia gente quebrando a cabeça com o DefaultTableModel, sendo que ele não é o modo correto de trabalhar com o JTable. E depois o código fica complicado, e o sujeito culpa o Swing.
Criar um CellEditor é muito simples. Você vai retornar para o JTable um JTextField, já com seu Document dentro. Veja um exemplo:
//O objetivo dessa classe é retornar um editor, que será usado pelo JTable para editar uma célula.
//O editor pode ser qualquer componente do Swing.
public class UpperCaseEditor extends AbstractCellEditor implements TableCellEditor {
// Esse é o componente que será usado para edição
JTextField editor = new JTextField();
public UpperCaseEditor() {
super();
//Associa seu document que só permite maiúsculas ao editor.
editor.setDocument(new UpperCaseDocument());
}
// Esse método é chamado quando o valor for editado pelo usuário.
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int rowIndex, int vColIndex) {
// 'value' é o valor contido na celula rowIndex, vColIndex
// Configura o componente com o valor que está na célula
editor.setText((String)value);
// Retorna o seu editor
return editor ;
}
// Esse método é chamado quando a edição termina
// Ele deve retornar o novo valor a ser armazenado na célula
public Object getCellEditorValue() {
return editor.getText();
}
}
E como você usa isso? Há duas maneiras.
1. Você pode configurar uma coluna para usar o editor:int vColIndex = 0;
TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new UpperCaseEditor());
table.setDefaultEditor(String.class, new UpperCaseEditor());
Nesse caso, todas as classes do seu model que retornarem o tipo String.class irão usar esse editor.
Tratar eventos de teclado raramente é o jeito certo de fazer as coisas. Não só no Swing, mas em qualquer API. Até pq, seu usuário pode resolver colocar texto na célula com CTRL+V, dado pelo mouse.
Legal cara, consegui colocar aqui em uma coluna…mas se eu quiser colocar na tabela toda como faço? Tenho que colocar coluna por coluna?
Tentei colocar para o tipo de dado mas qual tipo devo colocar?
Eu já programei em Visual Basic. Ou você está falando do VB.Net?
O grid dele é um inferno. Se você quiser fazer um editor personalizado num GridView do VB, você era obrigado a posicionar o editor manualmente sobre a célula, controlar os seus eventos para escondê-lo, capturar os eventos de scroll para movimenta-lo, etc. Isso porque o gridview do VB não dava esse tipo de suporte. Aliás, o VB também tinha muitas coisas irritantes. Sempre que você altera o valor de um componente no VB, seu form fica visível.
O Swing é muitíssimo mais rápido de programar e produtivo que o VB. É normal que você esteja parando muito agora, pois você ainda não sabe utiliza-lo direito, e está vencendo a curva de aprendizado das classes. Mas acredite, depois que você souber bem como os componentes se interligam, você jamais vai querer voltar ao VB.
Quanto à vinculação automática com o banco, existem classes que fazem isso de forma mais automática, mas não são padrão do Swing. Uma delas é o ObjectTableModel, da minha assinatura, mas não faz isso com o banco, e sim com uma lista de objetos. O projeto GlazedLists também tem modelos inteligentes desse tipo.
Como está implementado o seu TableModel? Ou você está usando o Default?