Só uppercase no jtable

7 respostas
marciosouzajunior

Alguem ai sabe como fazer o jtable só aceitar maiúsculas? Eu consegui fazer no textfield e no combo mas no table ta dificil…

7 Respostas

ViniGodoy

É só alterar o CellEditor da JTable.

Você já chegou a montar seu CellEditor?

marciosouzajunior

Não, ainda não tenho um celleditor. Será que você teria um pronto pra me passar?

ViniGodoy

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?

marciosouzajunior

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.

ViniGodoy

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());
2. Você pode torna-lo o editor padrão de um tipo de dado:
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.

marciosouzajunior

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?

ViniGodoy

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?

Criado 26 de agosto de 2010
Ultima resposta 26 de ago. de 2010
Respostas 7
Participantes 2