GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Jtable em formato moeda

Tags: #<Tag:0x00007f3bd95e0c38>

Pessoal, sou novo em programação, e achei alguns exemplos mas nao estou sabendo aplicar, preciso deixar os valores de uma columa da jtable em formato moeda, podem me dar uma força?

Segue a table.

private void carregarVendas() {
    listaModelVendasClientes = controllerVendasCliente.getListaVendasClienteControler();
    DefaultTableModel modelo = (DefaultTableModel) jtVendas.getModel();
    modelo.setNumRows(0);
    int cont = listaModelVendasClientes.size();
    modelo.setNumRows(0);
    for (int i = 0; i < cont; i++) {
        modelo.addRow(new Object[]{
            listaModelVendasClientes.get(i).getModelVendas().getIdVendas(),
            listaModelVendasClientes.get(i).getModelCliente().getCliNome(),
            listaModelVendasClientes.get(i).getModelVendas().getVenDataVenda(),
            listaModelVendasClientes.get(i).getModelVendas().getVenValorLiquido()
        });
        jtfVotalVendas.setText(CalculaTotalTabela().replace(",", "."));
    }
}`Texto pré-formatado`

Jovem, pára de usar DefaultTableModel e crie o seu próprio TableModel para renderizar coleções.

Aí você não vai mais precisar ficar fazendo esses laços desnecessários chamado o addRow do DefaultTableModel.

O DefaultTableModel só é útil quando você tem dados estáticos na tela e não quando seus dados são obtidos dinamicamente.

Faça o seguinte:

Dentro da sua tela, crie uma inner-class para ser o modelo da sua JTable:

private class TableModelVendasClientes extends AbstractTableModel {

    String[] colunas = new String[] { "ID", "NOME", "DATA VENDA", "VALOR LIQUIDO" };

    // este método é chamado pela JTable pra obter o número de colunas
    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    // este método é chamado pela JTable pra obter o nome da coluna informada
    @Override
    public String getColumnName(int col) {
        return colunas[col];
    }

    // este método é chamado pela JTable pra obter o número de linhas
    @Override
    public int getRowCount() {
        return listaModelVendasClientes == null ? 0 : listaModelVendasClientes.size();
    }

    // este método é chamado pela JTable pra obter o o valor a ser apresentado na célula informada
    @Override
    public Object getValueAt(int lin, int col) {
        if (listaModelVendasClientes != null && lin > -1 && lin <  listaModelVendasClientes.size()) {
            ModelVendas modelVendas =  listaModelVendasClientes.get(lin).getModelVendas();
            switch (col) {
                case 0:
                    return modelVendas.getIdVendas();
                case 1:
                    return modelVendas.getCliNome();
                case 2:
                    return modelVendas.getVenDataVenda();
                case 3:
                    return modelVendas.getVenValorLiquido(); // aqui, antes de retornar o valor, você pode formatar como quiser                
            }
        }
        return null;
    }
}

Altere a instanciação da sua JTable para ficar dessa forma:

jtVendas = new JTable(new TableModelVendasClientes());

E finalmente altere o seu método carregarVendas() dessa forma:

private void carregarVendas() {
    listaModelVendasClientes = controllerVendasCliente.getListaVendasClienteControler();
    ((TableModelVendasClientes) jtVendas.getModel()).fireTableDataChanged();
    jtfVotalVendas.setText(CalculaTotalTabela().replace(",", "."));
}
1 Curtida

Assino embaixo o que o @staroski disse; apenas recomendo criar seu TableModel um pouco mais genérico – para que possa reaproveitá-lo. Aqui vai um post do GUJ que leva essa discussão do DefaultTableModel um pouquinho mais afundo.

Obrigado pela ajuda ai.

staroski, Jakecoll, Boa tarde, então fiz de outra forma como me indicarão, porem me surgiu 1 errinho que nao estou sabendo resolver, na soma de uma coluna, consegui deixar em formato moeda mas da erro no metodo de soma, e so uma outra duvida, na coluna 01 chamo o id do cliente, porem quero chamar o nome do cliente que esta em uma outra classe, como chamo esta outra classe nao estou sabendo fazer isso, podem me dar uma dica?

private String CalculaTotalTabela() {
    Double Orcamento = 0.0;
    for (int i = 0; i < jtVendas.getRowCount(); i++) {
        Orcamento += Double.parseDouble(jtVendas.getValueAt(i, 3).toString());
    }
    return Orcamento.toString();
}

private void carregaTabela() {
    DefaultTableModel modelo = (DefaultTableModel) jtVendas.getModel();
    modelo.setNumRows(0);
    DAOVendas dao = new DAOVendas();

    for (ModelVendas m : dao.getListaVendasDAO()) {
        modelo.addRow(new Object[]{
            m.getIdVendas(),
            m.getCliente(),
            Utils.convertData(m.getVenDataVenda()),
            Utils.convertDouble(m.getVenValorBruto())
        });

    }

}`Texto pré-formatado`

Cria primeiro teu próprio TableModel, que fica fácil te ajudar.
Não insista no caminho das pedras.

Perceba que você já tem 2 laços desnecessários:

  • Um pra inserir itens num DefaultTableModel
  • Outro pra calcular um total

Isso que em algum outro lugar você já tem o laço que lê os registros do banco…

É por causa desse tipo de gambiarra que a galera acha que Java é lento. Risos.

Blz valeu vou ver oq faço aqui.

//