Olá amigos,
estou realizando o preenchimento de alguns dados diretamente em uma tabela, porém estou com o seguinte problema:
Nas colunas 5 e 6 cujo JTextField é simplesmente uma classe de herança que aplica as propriedades de um TextField monetário (TextFieldMoedaReal), ao clicar com o mouse sobre a célula, as propriedades do TextFieldMoedaReal são devidamente executadas, porém, caso eu acesse a célula apenas pelo teclado, as propriedades não são executadas.
Segue abaixo os devidos códigos para que possam me ajudar:
Criação do Model da tabela.
/**
* Seta e captura o modelo da tabela de produtos
*/
public DefaultTableModel getModelTabelaProdutos() {
TableColumn coluna1 = frame.tabelaProdutos.getColumnModel().getColumn(0);
TableColumn coluna2 = frame.tabelaProdutos.getColumnModel().getColumn(1);
TableColumn coluna3 = frame.tabelaProdutos.getColumnModel().getColumn(2);
TableColumn coluna4 = frame.tabelaProdutos.getColumnModel().getColumn(3);
TableColumn coluna5 = frame.tabelaProdutos.getColumnModel().getColumn(4);
TableColumn coluna6 = frame.tabelaProdutos.getColumnModel().getColumn(5);
/**Dimensiona as colunas na tabela**/
coluna1.setPreferredWidth(150);
coluna2.setPreferredWidth(50);
coluna3.setPreferredWidth(50);
coluna4.setPreferredWidth(50);
coluna5.setPreferredWidth(50);
coluna6.setPreferredWidth(70);
/*Preenche a coluna 1 com um combobox de produtos*/
String[] values = AbstractDAO.inicializaStringsComboBox(null, "produto");
coluna1.setCellEditor(new MyComboBoxEditor(values));
coluna1.setCellRenderer(new MyComboBoxRenderer(values));
//TextFieldMoedaReal textMoeda = new TextFieldMoedaReal();
//textMoeda.setNumber(BigDecimal.ZERO);
/*Aplica máscaras para as respectivas células da tabela*/
coluna2.setCellEditor(new DefaultCellEditor(new javax.swing.JFormattedTextField(new MascarasJTextField().inserirMascara("######"))));
coluna3.setCellEditor(new DefaultCellEditor(new javax.swing.JFormattedTextField(new MascarasJTextField().inserirMascara("######"))));
coluna4.setCellEditor(new DefaultCellEditor(new javax.swing.JFormattedTextField(new MascarasJTextField().inserirMascara("######"))));
coluna5.setCellEditor(new DefaultCellEditor(new TextFieldMoedaReal()));
coluna6.setCellEditor(new DefaultCellEditor(new TextFieldMoedaReal()));
/*Aplica o modelo*/
DefaultTableModel modelo = (DefaultTableModel) frame.tabelaProdutos.getModel();
modelo.setNumRows(0);
return modelo;
}
JFieldMoedaReal. Esta classe eu peguei de algum amigo desses fóruns na internet. Talvez tenha sido aqui mesmo.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gui.utils;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.math.BigDecimal;
import javax.swing.JTextField;
/*Classe desenvolvida por Renzo Nuccitelli
* para fazer validação de valores monetários
* em Real
*/
public class TextFieldMoedaReal extends JTextField implements KeyListener {
private StringBuilder lastValidNumber;
/**
* Aceita um BigDecimal com escala 2.
* Outras escalas não são serão aceitas
*
* @param BigDecimal
*/
public void setNumber(BigDecimal decimal){
System.out.println("escala: "+decimal.scale());
if(decimal.scale()==2){
lastValidNumber=new StringBuilder(decimal.unscaledValue().toString());
super.setText(getRealFormat());
}
}
/**Retorna um BigDecimal com o valor encontrando no campo
* e com escala igual a 2
*
* @return BigDecimal
*/
public BigDecimal getNumber(){
BigDecimal number;
if(lastValidNumber.length()==0)
number=new BigDecimal("0");
else
number=new BigDecimal(lastValidNumber.toString());
number.setScale(2);
return number.divide(new BigDecimal(100));
}
/**Aceita valor em centavos.
* O valor não deve possuir ponto ou vírgula
*
* @param String
*/
@Override
public void setText(String number){
if(isNumber(number))
lastValidNumber=new StringBuilder(number);
super.setText(getRealFormat());
}
private boolean isNumber(String number){
for(char c: number.toCharArray()){
if(!Character.isDigit(c))
return false;
}
return true;
}
public TextFieldMoedaReal() {
super();
this.setCaretPosition(this.getText().length());
this.addKeyListener(this);
lastValidNumber=new StringBuilder();
super.setText(getRealFormat());
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
if(Character.isDigit(e.getKeyChar())){
lastValidNumber.append(e.getKeyChar());
}
else if(e.getKeyCode()==KeyEvent.VK_BACK_SPACE){
if(lastValidNumber.length()>0){
lastValidNumber.deleteCharAt(lastValidNumber.length()-1);
}
}
this.setText(getRealFormat());
}
@Override
public void keyTyped(KeyEvent e) {
}
private String getRealFormat(){
if(lastValidNumber.length()==0)
return "0,00";
else if(lastValidNumber.length()==1)
return "0,0"+lastValidNumber;
else if(lastValidNumber.length()==2)
return "0,"+lastValidNumber;
else
return buildPrefixSeparateWithDots()+lastValidNumber.substring(lastValidNumber.length()-2);
}
private String buildPrefixSeparateWithDots(){
StringBuilder builder=new StringBuilder();
for(int index=0;index<lastValidNumber.length()-2;++index){
builder.append(lastValidNumber.charAt(index));
if((lastValidNumber.length()-index)%3==0&&lastValidNumber.length()-index>5)
builder.append(".");
}
builder.append(',');
return builder.toString();
}
}