Я хочу проверить поле jtext, когда пользователь вводит цену некоторого элемента.
У меня есть отлично работающий код, который издает звуковой сигнал и сбрасывает, если пользователь вводит какой-либо символ, который не соответствует регулярному выражению. (Для регулярного выражения "[0-9] +" он принимает любое количество цифр и издает звуковой сигнал, если дается буква в качестве ввода)
Но проблема в том, что я хочу проверить ввод, например "12500.00". Формат должен содержать любое количество цифр перед десятичной запятой и две цифры после десятичной запятой. например: ddd.dd
Я попробовал следующее регулярное выражение. Но я не позволяю пользователю вводить "." персонаж. Это позволяет пользователю вводить любое количество цифр, но когда "." клавиша нажата, ввод не принят.
вот регулярное выражение, которое я использовал.
"[0-9] + | [0-9] +. | [0-9] +. [0-9] {1} | [0-9] +. [0-9] {2}"
важно: пользовательский ввод проверяется символ за символом, так как пользователь вводит их в поле jtext.
Вот код
import java.awt.Toolkit;
import java.util.regex.Pattern;
import javax.swing.JComponent;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public abstract class ValidatedTextField extends PlainDocument {
private int max;
private String regExp;
public ValidatedTextField(int max, String regExp) {
this.max = max;
this.regExp = regExp;
}
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
Pattern DIGITS = Pattern.compile(regExp);
// System.out.println(str);
if (getLength() + str.length() > max) {
str = str.substring(0, max - getLength());
Toolkit.getDefaultToolkit().beep();
}
if (!DIGITS.matcher(str).matches() || str == null) {
str = null;
Toolkit.getDefaultToolkit().beep();
}
if (str != null && !passDependency(str)) {
str = null;
Toolkit.getDefaultToolkit().beep();
}
//str != null && DIGITS.matcher(str).matches
super.insertString(offs, str, a);
}
public abstract boolean passDependency(String str);
public void shiftFocus(JComponent jc, boolean condition) {
if (condition) {
jc.requestFocusInWindow();
}
}
}
Ниже приведен не точный код, но я так его и использую.
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.*;
public class ValidateTest {
void makeFrame(){
JFrame jf=new JFrame("Verifier Test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField text = new JTextField();
JLabel lbl=new JLabel("Price");
text.setDocument(new ValidatedTextField(10, "[0-9]+") {
@Override
public boolean passDependency(String str) {
return true;
}
});
text.setPreferredSize(new Dimension(200, 30));
lbl.setPreferredSize(new Dimension(60, 30));
jf.getContentPane().add(text, BorderLayout.EAST);
jf.getContentPane().add(lbl, BorderLayout.WEST);
jf.pack();
jf.setVisible(true);
text.setVisible(true);
}
public static void main(String[] args) {
new ValidateTest().makeFrame();
}
}