JTable no formato Moeda - Problema com focus na mudança de valores

Bom dia pessoal tudo bem ?

Estou com um problema que já esta me matando faz alguns dias, já n to conseguindo pensar em mais nada para fazer isto da certo !

É o seguinte !! Eu quero fazer um Jtable onde todas as celulas dela tenha o formato de Moeda “R$45,00”, blz eu fiz um render e um editor… até ai blz todas as minhas celulas estão bonitinhas no formato, porem quando eu clico e edito um valor em uma celula e mudo de foco o valor continua o antigo, ele só pega o novo valor se eu apertar enter e depois mudar de facu … gostaria que alguem me ajuda-se a solucionar este problema de focus…

MINHA JTABLE


	String[] columnNames = {"Teste",
            "Teste",
            "Teste",
            "Teste",
            "Teste"};

	Object[][] data = {
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12},
		    {12, 12,12, 12, 12}
		};
	
	DefaultTableModel modelo = new DefaultTableModel( data , columnNames );     
	JTable jTable1 = new JTable( modelo );  // linha e coluna   

	jTable1.getColumnModel().getColumn(1).setCellEditor(new NumbCellEditor());   
	jTable1.getColumnModel().getColumn(1).setCellRenderer(new NumbCellRender());   
	jTable1.getColumnModel().getColumn(2).setCellEditor(new NumbCellEditor());   
	jTable1.getColumnModel().getColumn(2).setCellRenderer(new NumbCellRender()); 
	jTable1.setBounds(10, 10, 600, 600);
	telaPrincipal.add(jTable1);

NumbCellRender

import java.awt.Component;
import java.text.NumberFormat;
import java.util.Locale;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;

public class NumbCellRender extends JLabel implements TableCellRenderer {   
  
    /**  
     * classe para mostrar a celula com formato de moeda  
     */   
    private static final long serialVersionUID = 1L;   
    private JLabel cell = null;   
    private NumberFormat formatter = NumberFormat.getCurrencyInstance( new Locale("pt","BR") ); // Locale.getDefault()   
       
    private JLabel getCell() {   
        if (cell == null)   
            cell = new JLabel();   
        return cell;   
    }   
  
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {   
        if (value != null) {   
            getCell().setText( formatter.format(value) );   
            getCell().setHorizontalAlignment(SwingConstants.RIGHT);   
        } else getCell().setText("");   
        return getCell();   
    }  
  
}  

NumbCellEditor

import java.awt.Component;
import java.text.NumberFormat;
import java.util.Locale;

import javax.swing.AbstractCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
public class NumbCellEditor extends AbstractCellEditor implements TableCellEditor {   
       
	   /**  
     * classe para editar a celula com formato de moeda  
     */   
    private static final long serialVersionUID = 1L;   
    private JFormattedTextField moeda = null;   
    private NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("pt","BR"));   
       
    private JFormattedTextField getCell() {   
        if (moeda == null)   
            moeda = new JFormattedTextField(formatter);   
        return moeda;   
    }   
  
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {   
        getCell().setValue(value);   
        return getCell();   
    }   
  
    public Object getCellEditorValue() {   
        return getCell().getValue();   
    }   
  
  
}  

Hum nada de ideias ? :S ta tenso !!

Bom com muito esforço eu consegui fazer !! não sei se é a melhor forma ou a mais simples, se alguem conhecer alguma melhor por favor poste!

PS: não liga a bagunça pq eu estava testando = loko

import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class EditorTest {
    private JScrollPane getTableComponent() {
        String[] colNames = {
            "Preço", "Número"
        };
        final Object[][] data = {
            {  new Double(2), Double.valueOf(12.21) },
            {  Double.valueOf(12.21), Double.valueOf(12.21) },
            {  Double.valueOf(12.21), Double.valueOf(12.21) },
            {  Double.valueOf(12.21), Double.valueOf(12.21) }
        };
        DefaultTableModel model = new DefaultTableModel(data, colNames) {
            public Class getColumnClass(int col) {
                return data[0][col].getClass();
            }
        };
        
        JTable table = new JTable(model);
        TableColumnModel colModel = table.getColumnModel();
        //colunas
        colModel.getColumn(0).setCellRenderer(new DoubleRenderer());
        colModel.getColumn(1).setCellRenderer(new DoubleRenderer());
        
        table.setCellSelectionEnabled(true);
        Dimension d = table.getPreferredSize();
        table.setPreferredScrollableViewportSize(d);
        return new JScrollPane(table);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new EditorTest().getTableComponent());
        f.pack();
        f.setLocation(100,100);
        f.setVisible(true);
    }
}


class DoubleRenderer extends DefaultTableCellRenderer {
    NumberFormat numeroFormatado = NumberFormat.getCurrencyInstance();

    public DoubleRenderer() {
        setHorizontalAlignment(RIGHT);
    }

    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected,
                                            hasFocus, row, column);
        setText(numeroFormatado.format(((Double)value).doubleValue()));
        return this;
    }
}

usei na ProdutoView e nao deu erro e na importa produto tambem nao, porem so quando eu adciono essa renderer em MovimentoVendaView na detailTable.
mostra o erro seguinte:

[code]Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 3 >= 0
at java.util.Vector.elementAt(Vector.java:427)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277)
at br.com.siscom.view.MovimentoVenda.initComponents(MovimentoVenda.java:466)
at br.com.siscom.view.MovimentoVenda.(MovimentoVenda.java:24)
at br.com.siscom.view.MovimentoVenda$1.run(MovimentoVenda.java:898)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:284)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

[/code]

o problema maior e que mesmo tirando o vinculo ele nao para mais de dar o erro, eu to ficando doido com essa merda aqui.

Velinhos, estou com o mesmo problema de vcs… o teste solução do Alchemist é bacana, porem… no meu caso, quando tiver no modo de edição a célula… tem q ficar no formado de um jformattedTextField…

e estou apanhando pacas… help…

Achei uma solução… que na minha opinião é a melhor delas…

http://www.java-forum.org/codeschnipsel-u-projekte/53053-numberrenderer-numbereditor-fuer-jtable.html

Espero que apreciem… Abraços…

Olá galera

Estou com um probleminha aqui e gostaria se possivel a ajuda de vocês.

Bom o meu problema é o seguinte tenho uma tabela de produtos e ela no meu banco de dados está no formato decimal, criei uma tela mestre detalhes e nesta tela aparece corretamente o valor dos campos total e vlr unitário como está no banco, pois ela importou como BIGDECIMAL, criei uma outra tela para saidas de produtos e se manter como BIGDECIMAL ela dá erro pois na importação do produto aparece um erro dizendo que java.lang.bigdecimal não suporta double ou da um erro de exeção, se passar tudo desde a tela de produto para double funciona normalmente mas na vizualização dos campos total e vlr unitário o valor não aparece como no banco exemplo: no banco com bigdecimal o campo valor total= 4325.90 e vlr unitário aparece 12,50 ou mas no java como double ele oculta uma casa exemplo: valor total 4325.9 e vlr unitário 12.5, e no caso de valor inteiro ele mostra apenas os dois primeiros numeros exemplo 12.00 ele mostra 12 e 4325.00 ele mostra apenas 4325 ,gostaria de saber se tem como formatar um campo com valor double para decimal, andei pesquisando e parece que tem uma classe (RenderFormat) que vc cria para formatar uma determinada coluna e linha na jtable e gostaria de saber como criar está classe e como indicar ela numa Jtable criada como mestre detalhe.

Agradeço desde já a atenção dos amigos e aguardo ajuda para o problema

Desculpem se não é neste topico e caso não seja me redirecione para o topico correto