Когда пользователь пытается ввести нечисловые данные, он отклоняет и удаляет ввод, который не является целым числом.
public class NumericTextField extends JTextField implements KeyListener{
private int value;
public NumericTextField(int value) {
super(value+ "");
this.addKeyListener(this);
}
public NumericTextField() {
super();
this.addKeyListener(this);
}
public Object getValue() {
return value;
}
public void setText(int value) {
super.setText(value + "");
this.value = value;
}
@Override
public void keyPressed(KeyEvent evt) {
}
@Override
public void keyReleased(KeyEvent arg0) {
isValidChar(arg0.getKeyChar());
}
@Override
public void keyTyped(KeyEvent arg0) {
}
//it is not good solution but acceptable
private void isValidChar(char ch){
if(this.getText().length() == 1 && this.getText().equals("-") ){
this.setText("-");
}
else {
if(!isNumeric(Character.toString(ch))){
try{
this.setText(removeNonnumericChar(this.getText(), ch));
}catch(Exception e){
}
}
}
}
private boolean isNumeric(String text) {
try {
Integer.parseInt(text);
return true;
} catch (NumberFormatException e) {
return false;
}
}
//remove nonnumeric character
private String removeNonnumericChar(String text, char ch){
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
if(text.charAt(i) != ch){
sBuilder.append(text.charAt(i));
}
}
return sBuilder.toString();
}
}
А это тестовый класс
public class NumericTextFieldTest extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
NumericTextFieldTest frame = new NumericTextFieldTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public NumericTextFieldTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 200, 150);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
NumericTextField numericText = new NumericTextField();
numericText.setBounds(25, 27, 158, 19);
contentPane.add(numericText);
numericText.setColumns(10);
JLabel lblNumericTextfield = new JLabel("Numeric textField");
lblNumericTextfield.setBounds(37, 12, 123, 15);
contentPane.add(lblNumericTextfield);
}
}