Olá pessoal, preciso de uma ajuda, não sei se é possível.
Peguei essa classe aqui no GUJ de máscara de campo JTextField.
Ela está funcionando perfeitamente, porem só aceita valores positivos, como posso fazer para que aceite valores negativos também?
/**
* Campo para a inserção de números com base em um formato.
*
* @author Dyorgio da Silva Nascimento
*/
public class JNumberFormatField extends JTextField {
private static final long serialVersionUID = -7506506392528621022L;
private static final NumberFormat MONETARY_FORMAT = new DecimalFormat("R$ #,###,##0.00");
private NumberFormat numberFormat;
private int limit = -1;
public JNumberFormatField(int casasDecimais) {
this(new DecimalFormat((casasDecimais == 0 ? "#,###,###.00" : "#,###,###.00.") + makeZeros(casasDecimais)));
}
public JNumberFormatField() {
this(MONETARY_FORMAT);
}
public JNumberFormatField(NumberFormat format) {
// define o formato do número
numberFormat = format;
// alinhamento horizontal para o texto
setHorizontalAlignment(LEFT);
// documento responsável pela formatação do campo
setDocument(new PlainDocument() {
private static final long serialVersionUID = 1L;
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
String text = new StringBuilder(JNumberFormatField.this.getText().replaceAll("[^0-9]", ""))
.append(str.replaceAll("[^0-9]", "")).toString();
super.remove(0, getLength());
if (text.isEmpty()) {
text = "0";
} else {
text = new BigInteger(text).toString();
}
super.insertString(0,
numberFormat.format(new BigDecimal(
getLimit() > 0 == text.length() > getLimit() ? text.substring(0, getLimit()) : text)
.divide(new BigDecimal(Math.pow(10, numberFormat.getMaximumFractionDigits())))),
a);
}
@Override
public void remove(int offs, int len) throws BadLocationException {
super.remove(offs, len);
if (len != getLength()) {
insertString(0, "", null);
}
}
});
// mantem o cursor no final do campo
addCaretListener(new CaretListener() {
boolean update = false;
@Override
public void caretUpdate(CaretEvent e) {
if (!update) {
update = true;
setCaretPosition(getText().length());
update = false;
}
}
});
// limpa o campo se apertar DELETE
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
setText("");
}
}
});
// formato inicial
setText("0");
setCaretPosition(getText().length());
}
/***
* Define um valor BigDecimal ao campo**
*
* @param value
*/
public void setValue(BigDecimal value) {
super.setText(numberFormat.format(value));
}
/***
* Recupera um valor BigDecimal do campo**
*
* @return
*/
public final BigDecimal getValue() {
return new BigDecimal(getText().replaceAll("[^0-9]", ""))
.divide(new BigDecimal(Math.pow(10, numberFormat.getMaximumFractionDigits())));
}
/***
* Recupera o formatador atual do campo**
*
* @return
*/
public NumberFormat getNumberFormat() {
return numberFormat;
}
/***
* Define o formatador do campo** @param numberFormat
*/
public void setNumberFormat(NumberFormat numberFormat) {
this.numberFormat = numberFormat;
}
/***
* Preenche um StringBuilder com zeros** @param zeros*
*
* @return
*/
private static final String makeZeros(int zeros) {
if (zeros >= 0) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < zeros; i++) {
builder.append('0');
}
return builder.toString();
} else {
throw new RuntimeException("Número de casas decimais inválida (" + zeros + ")");
}
}
/***
* Recupera o limite do campo.** @return
*/
public int getLimit() {
return limit;
}
/***
* Define o limite do campo, limit < 0 para deixar livre (default) Ignora os
* pontos e virgulas do formato, conta* somente com os números** @param
* limit
*/
public void setLimit(int limit) {
this.limit = limit;
}
}
package util;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
/**
* Campo para a inserção de números com base em um formato.
*
* @author Dyorgio da Silva Nascimento
*/
public class JNumberFormatField extends JTextField {
private static final long serialVersionUID = -7506506392528621022L;
private static final NumberFormat MONETARY_FORMAT = new DecimalFormat("R$ #,##0.00");
private NumberFormat numberFormat;
private int limit = -1;
public JNumberFormatField(int casasDecimais) {
this(new DecimalFormat((casasDecimais == 0 ? "#,##0" : "#,##0.") + makeZeros(casasDecimais)));
}
public JNumberFormatField() {
this(MONETARY_FORMAT);
}
public JNumberFormatField(NumberFormat format) {// define o formato do
// número
numberFormat = format;// alinhamento horizontal para o texto
setHorizontalAlignment(RIGHT);// documento responsável pela formatação
// do campo
setDocument(new PlainDocument() {
private static final long serialVersionUID = 1L;
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
String first = (!JNumberFormatField.this.getText().isEmpty()) ? String.valueOf(JNumberFormatField.this.getText().charAt(0)) : "";
String fStr = (!str.isEmpty()) ? String.valueOf(str.charAt(0)) : "";
String text = new StringBuilder(JNumberFormatField.this.getText().replaceAll("[^0-9]", "")).append(str.replaceAll("[^0-9]", "")).toString();
super.remove(0, getLength());
if (text.isEmpty()) {
text = "0";
} else {
text = new BigInteger(text).toString();
}
BigDecimal n = new BigDecimal(getLimit() > 0 == text.length() > getLimit() ? text.substring(0, getLimit()) : text).divide(new BigDecimal(Math.pow(10, numberFormat.getMaximumFractionDigits())));
if (str.equals("-") || first.equals("-") || fStr.equals("-")) {
n = n.multiply(new BigDecimal(-1));
}
super.insertString(0, numberFormat.format(n), a);
}
@Override
public void remove(int offs, int len) throws BadLocationException {
super.remove(offs, len);
if (len != getLength()) {
insertString(0, "", null);
}
}
});// mantem o cursor no final
// do campo
addCaretListener(new CaretListener() {
boolean update = false;
@Override
public void caretUpdate(CaretEvent e) {
if (!update) {
update = true;
setCaretPosition(getText().length());
update = false;
}
}
});// limpa o campo se
// apertar DELETE
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DELETE) {
setText("");
}
}
});// formato
// inicial
setText("0");
setCaretPosition(getText().length());
}
/**
* *
* Define um valor BigDecimal ao campo**
*
* @param value
*/
public void setValue(BigDecimal value) {
super.setText(numberFormat.format(value));
}
/**
* *
* Recupera um valor BigDecimal do campo**
*
* @return
*/
public final BigDecimal getValue() {
String first = (!getText().isEmpty()) ? String.valueOf(getText().charAt(0)) : "0";
BigDecimal valor = new BigDecimal(getText().replaceAll("[^0-9]", "")).divide(new BigDecimal(Math.pow(10, numberFormat.getMaximumFractionDigits())));
if (first.equals("-")) {
valor = valor.multiply(new BigDecimal(-1));
}
return valor;
}
/**
* *
* Recupera o formatador atual do campo**
*
* @return
*/
public NumberFormat getNumberFormat() {
return numberFormat;
}
/**
* *
* Define o formatador do campo** @param numberFormat
*/
public void setNumberFormat(NumberFormat numberFormat) {
this.numberFormat = numberFormat;
}
/**
* *
* Preenche um StringBuilder com zeros** @param zeros*
*
* @return
*/
private static final String makeZeros(int zeros) {
if (zeros >= 0) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < zeros; i++) {
builder.append('0');
}
return builder.toString();
} else {
throw new RuntimeException("Número de casas decimais inválida (" + zeros + ")");
}
}
/**
* *
* Recupera o limite do campo.** @return
*/
public int getLimit() {
return limit;
}
/**
* *
* Define o limite do campo, limit < 0 para deixar livre (default) Ignora os
* pontos e virgulas do formato, conta* somente com os números** @param
* limit
*/
public void setLimit(int limit) {
this.limit = limit;
}
// testes, pode ser removido
public static void main(String[] args) {
JFrame frame = new JFrame("Teste do campo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setResizable(false);
frame.add(new JNumberFormatField() {
{// limita a 4
// caracteres
setLimit(4);
}
});
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}