Trocar ponto por vírgula em uma JTable

4 respostas
S

Procurei em muitos lugares mas nada do pouco que encontrei satisfez minha dúvida:

Tenho uma JTable com as notas dos alunos. As três colunas a ser preenchidas mais a coluna com a média são do tipo float.
Graças a Deus está tudo funcionando normalmente, mas o que eu quero é aceitar vírgulas no lugar de ponto.

Eu sei usar NumberFormat, DecimalFormat e também replace(".",","), etc...
O problema é que não estou conseguindo associar isso à tabela.

É bom e gosto que estas colunas estejam em float, pois a tabela automaticamente rejeita qualquer caractere diferente de dígitos e ponto, impedindo o usuário de terminar a edição caso coloque algum caractere diferente desses, mas gostaria de fazer a tabela permitir vírgula para a casa decimal.

Abaixo a parte do setValueAt e getValueAt:

@Override
    public Object getValueAt(int row, int column) {
        /* Recebe o valor da classe Aluno a ser passado para a tabela */
        if(column == 0)
            return (row+1);
        else if(column == 1)
            return alunos.get(row).getNome();
        else if(column >= 2 && column <= 4){
            if(alunos.get(row).getNota(column - 2) == -1) //Se a nota é igual a -1 entao a celula é vazia
                return "";
            else
                return alunos.get(row).getNota(column - 2);
        }
        else
            return alunos.get(row).getMedia();
    }  

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
        /* Recebe o valor da tabela a ser passado à classe Aluno */
        if(aValue == null)
            return ;

        String a = aValue.toString();

        if(columnIndex == 1)
            alunos.get(rowIndex).setNome(a);

        if(columnIndex >= 2 && columnIndex <= 4){
            if(a.equals("")){ //Se a célula está vazia, passa pra classe aluno o valor -1
                alunos.get(rowIndex).setNota(columnIndex - 2, -1.0f);
            }
            else{
                float b = Float.parseFloat(a);
                if(b < 0 || b > 10){//Impedir notas maiores que 10 e menores que 0
                    Dialogo.erro("Insira valores entre 0 e 10");
                    return ;
                }
                else
                    alunos.get(rowIndex).setNota(columnIndex - 2, b);
            }
        }
        else return ;

        fireTableRowsUpdated(rowIndex, columnIndex);
    }  

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        /* Classe das colunas */
        if(columnIndex >= 2 && columnIndex <= 4)
            return Float.class;
        return String.class;
    }

4 Respostas

Leozin

e se você ao invés de usar um getMedia() direto. por que não cria um método "getMediaFormatada()" ou algo do gênero?

a implementação poderia ser assim
NumberFormat formatter = NumberFormat.getInstance(new Locale("pt", "BR"));

return formatter.format(media);

ou seja, onde tu tens o código

return alunos.get(row).getMedia();

tu podes colocar assim:

public Object getValueAt(int row, int column) {
   //outro código...
   return formatar(alunos.get(row).getMedia());  
}

public String formatar(float nota) {
NumberFormat formatter = NumberFormat.getInstance(new Locale("pt", "BR"));

return formatter.format(nota);
}

dessa maneira, notas como 9.5 vão aparecer como 9,5. Caso tu queiras colocar 9,50, basta definir o seguinte método:

formatter.setMinimumFractionDigits(2);
S

Leozin, me ajudou muito, melhorou a minha tabela, mas ainda não satisfez a minha principal dúvida, pois uma tabela com célula em float.class impede que o usuário utilize vírgula na hora de escrever sobre a tabela. Após ser escrita, a tabela troca o ponto pela vírgula com essa implementação sugerida, mas o usuário ainda não pode escrever com vírgula.

Alguém sabe como permitir isso?

Leozin

E se você colocar como String a tua tabela e, na hora de fazer os devidos cálculos, fazer um parse do valor, será que não dá certo?

S

Desculpe a demora em responder, pois estive fora uns dias…

Acabei fazendo com String mesmo e pegando a exceção NumberFormatException.

if(columnIndex >= 2 && columnIndex <= 4){ a = a.replaceAll(",","."); //Pega a vírgula digitada pelo usuário e repõe por ponto try{ if(a.equals("")){ alunos.get(rowIndex).setNota(columnIndex - 2, -1.0f); } else{ float b = Float.parseFloat(a); if(b < 0 || b > 10){ Dialogo.erro("Insira valores entre 0 e 10"); return ; } else alunos.get(rowIndex).setNota(columnIndex - 2, b); } }catch(NumberFormatException e){ Dialogo.erro("Digite um número válido"); } } else return ;

Obrigado pelas dicas.

Criado 11 de janeiro de 2012
Ultima resposta 16 de jan. de 2012
Respostas 4
Participantes 2