Opa,
iae Joni blz cara?
olha só ... em meu sistema aqui eu faço da seguinte maneira ... espero que te ajude...
A classe renderer para a tabela:
class TCRenderer extends DefaultTableCellRenderer {
public TCRenderer () {
super();
}
@Override
public Component getTableCellRendererComponent(javax.swing.JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column){
JLabel label = (JLabel)super.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
//caso queira alinhar os campos da tua tabela
if (column == 1) {
label.setHorizontalAlignment(JLabel.CENTER);
}
//aqui vc diz ao renderizador como mostrar o valor quando a célula não estiver em edição
if (column == 1) {
if (!"".equalsIgnoreCase(label.getText()))
label.setText(String.format("%,.2f", new BigDecimal(label.getText())));
else
label.setText(String.format("%,.2f", new BigDecimal(0)));
}
//aqui vc faz uma visualização de tabela zebrada
Color cor = Color.BLACK;
label.setForeground(cor);
if((row % 2) == 0)
label.setBackground(Color.WHITE);
else
label.setBackground(new Color(245, 244, 244));
//aqui vc coloca um destaque para a celula quando a mesma é selecionada
if (hasFocus == true){
label.setBackground(new Color(230, 254, 222));
}
return label;
}
}
Agora a classe Editor para tua tabela
class TCEditor extends AbstractCellEditor implements TableCellEditor{
private JTextField componenteMoeda = new JTextField();
private int coluna;
String retorno;
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column ) {
coluna = column;
if (value == null){
if (column == 1) {
componenteMedida = Utils.preencheCampoMoeda(componenteMoeda, null);
}
} else {
if (column == 1) {
//esta linha vc configura o campo de moeda na tua tabela
componenteMoeda = Utils.preencheCampoMoeda(componenteMoeda, new BigDecimal(value.toString()));
}
}
//alinhamento
if (column == 1) {
componente.setHorizontalAlignment(JLabel.RIGHT);
}
//retorno do campo selecionado para a tabela
if (column == 1) {
componenteMoeda.selectAll();
return componenteMoeda;
}
}
public Object getCellEditorValue() {
if (coluna == 1) {
//aqui vc carrega a variavel de retorno para ser usada em sua logica
retorno = componenteMoeda.getText().replaceAll("\\.", "").replaceAll(",", ".");
//aqui vc limpa o campo da tabela
componenteMoeda = Utils.preencheCampoMoeda(componenteMoeda, null);
//aqui é o retorno do valor inserido
return retorno;
}
}
//método para não deixar a célula entrar em modo de edição ao click do mouse
@Override
public boolean isCellEditable(EventObject e) {
if (e instanceof MouseEvent)
return false;
return super.isCellEditable(e);
}
}
Alguns métodos que irão te ajudar não só com a tabela mas com todos os campos onde vc queira colocar estilo de moeda sendo este um JTextField:
public static JTextField preencheCampoMoeda(final JTextField tfMoeda, BigDecimal valor){
tfMoeda.setDocument(new LimitadorMoeda());
tfMoeda.setText(Utils.bigDecimalToStringMoeda(valor));
tfMoeda.setHorizontalAlignment(JTextField.RIGHT);
tfMoeda.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
super.focusGained(e);
tfMoeda.selectAll();
}
});
return tfMoeda;
}
public static String bigDecimalToStringMoeda(BigDecimal valor){
String vl = "0";
if (valor != null){
valor = valor.setScale(2, BigDecimal.ROUND_HALF_DOWN);
vl = valor.toString().replaceAll("\\.", "");
}
return vl;
}
A classe responsável pelo estilo de moeda:
import javax.swing.text.*;
public class LimitadorMoeda extends PlainDocument {
public static final int maxdigits = 12;
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
String texto = getText(0, getLength());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (!Character.isDigit(c)) {
return;
}
}
if(texto.length() < LimitadorMoeda.maxdigits){
super.remove(0, getLength());
texto = texto.replace(".", "").replace(",", "");
StringBuffer s = new StringBuffer(texto + str);
if (s.length() > 0 && s.charAt(0) == '0') {
s.deleteCharAt(0);
}
if(s.length() < 3) {
if (s.length() < 1) {
s.insert(0,"000");
} else if (s.length() < 2) {
s.insert(0,"00");
} else {
s.insert(0,"0");
}
}
s.insert(s.length()-2, ",");
if(s.length() > 6) {
s.insert(s.length()-6, ".");
}
if(s.length() > 10) {
s.insert(s.length()-10, ".");
}
super.insertString(0, s.toString(), a);
}
}
@Override
public void remove(int offset, int length) throws BadLocationException {
super.remove(offset, length);
String texto = getText(0, getLength());
texto = texto.replace(",", "");
texto = texto.replace(".", "");
super.remove(0, getLength());
insertString(0, texto, null);
}
}
Modo de usar na configuração de sua tabela:
TCRenderer tcr = new TCRenderer();
TCEeditor tce = new TCEditor();
TableColumnModel modeloColuna = tabela.getColumnModel();
modeloColuna.getColumn(i).setCellRenderer(tcr);
modeloColuna.getColumn(i).setCellEditor(tce);
Modo de inserir na tabela:
modeloDaSuaTabela.setValueAt(suaVariavelBigDecimal, linha, coluna);
Modo de pegar o valor da tabela:
BigDecimal suaVariavel = new BigDecimal(modeloDaSuaTabela.getValueAt(linha, coluna).toString());
Cara .. eu faço desse jeito ... pode ser que vc encontre uma forma melhor para fazer .. mas dessa forma me atende muito bem
no mas, espero ter te ajudado
Até