private class FracaoIdealListener extends PlainDocument implements DocumentListener{
private JTextField aue;
private JTextField ate;
public static final int NUMERO_DIGITOS_MAXIMO = 12;
public FracaoIdealListener(JTextField aue,JTextField ate){
this.aue=aue;
this.ate=ate;
}
public void changedUpdate(DocumentEvent e) {
/*Do nothing*/
}
public void insertUpdate(DocumentEvent e) {
if(aue.getText()!=null&&ate.getText()!=null){
Double edificada=Double.parseDouble(f.convertToBigDecimalFormat(aue.getText()));
Double total=Double.parseDouble(f.convertToBigDecimalFormat(ate.getText()));
if(total>edificada){
JOptionPane.showMessageDialog(null,"Atenção!Tem que haver mais de uma unidade no FCnul");
}else{
new Thread( new Runnable() {
public void run() {
String fracao=f.atualizarFracaoIdeal2(areaEdField.getText(),areaTotField.getText());
fracaoIdeal.setText(fracao);
}
} ).start();
}
}else{
fracaoIdeal.setText("1.00");
}
}//fim do insert update
public void removeUpdate(DocumentEvent e) {
String s = aue.getText();
if(s.length()<1)
fracaoIdeal.setText("1.00");
}
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() < this.NUMERO_DIGITOS_MAXIMO){
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);
}
}
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);
}
}//fim da classe privada FracaoIdealListener
JTextFields e Document Complexo
5 Respostas
Hum…ando fazendo uns testes aqui não daria para usar os dois pq ambos ocupam a vaga de Document… alguém conhece uma forma de deixar um TextField formatado para números (por exemplo:1.250,50) que NÃO use PlainDocument nem JFormatterTextField?
Bom, depois de 178901234 testes(na verdade foram uns 30… :lol:), descobri que:
Maskformatter não me atende(o tamanho não flexbiliza bem), e parece “pesado” em máquinas antigas.
Não dá para substituir o DocumentListener como opção para os JtextFields dinâmicos.Dessa forma é a única que eles trablham 100% e sem erros.Estou terminando os testes com InputVerifier(usando DecimalFormat), e parece que ele será a única opção de formatação e manter o dinamismo ao mesmo tempo.
Ironlynx, estou com um problema q é o seguinte…
Criei um TextFieldMonetario e quero utiliza-lo em um jTable…
Criei tb meus CellRenderer e CellEditor, para q quando terminar a edição do valor, aparecer a formatação do Currency.
O problema é que, quando clico na célula para modificar o valor, ela fica LIMPA…
Nesse link abaixo estão as classes… rode para entender melhor o problema, e se puder, dê seu palpite.
http://www.dataview.com.br/TESTES.zip
Soh fazer o DL e rodar a classe ParseText2.
xD
root, eu tô com um prazo apertado aqui, e não dá para testar o projeto, poste com as tags code o seu controle de foco na sua JTable.
no link tao soh as classes q utilizo e um exemplo mesmo… soh executar o ParseText2.
Creio que você vai se interessar por essa solução de mascaramento de valor monetário bem como de edição com auto-completar de casas de milhar e decimal.