我想在jFormattedTextField中使用正则表达式模式(或者如果可能,在JTextField中,如果作业完成则无关紧要)。我知道使用MaskFormatter和DocumentFilter,但我想知道是否可以使用正则表达式模式。
这是我尝试过的代码:
import java.awt.GridLayout;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class Test1 {
public static void main(String args[]) {
JFrame frame = new JFrame();
String regex = "[a-z]";
Pattern pt = Pattern.compile(regex);
Matcher r = pt.matcher("(.*)([a-z])");
JFormattedTextField ft = new JFormattedTextField(pt);
JTextField testField = new JTextField();
ft.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent e) {
if (!r.find()) {
testField.setText("not found");
} else
testField.setText("found");
}
});
frame.setLayout(new GridLayout(2, 1));
frame.add(ft);
frame.add(testField);
frame.pack();
frame.setVisible(true);
}
}
但它不起作用(继续显示“未找到”)。有办法做到这一点吗?因为我已经练习了一段时间,所以使用正则表达式感觉更舒服。
答案 0 :(得分:2)
我不确定你为什么要搜索你的模式匹配你试图做以下事情?
import java.awt.GridLayout;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class Test1 {
public static void main(String args[]) {
JFrame frame = new JFrame();
String regex = "[a-z]";
Pattern pt = Pattern.compile(regex);
JFormattedTextField ft = new JFormattedTextField(pt);
JTextField testField = new JTextField();
ft.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent e) {
Matcher r = pt.matcher(ft.getText());
if (!r.find()) {
testField.setText("not found");
} else
testField.setText("found");
}
});
frame.setLayout(new GridLayout(2, 1));
frame.add(ft);
frame.add(testField);
frame.pack();
frame.setVisible(true);
}
}
答案 1 :(得分:2)
你根本不需要Matcher
; String
使用matches()
方法更方便。
假设"发现"意味着在输入中找到一个字母:
ft.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent e) {
if (ft.getText().matches(".*[a-z].*"))
testField.setText("not found");
else
testField.setText("found");
}
});
或者,如果您愿意,可以使用三元语言将其表达为一行:
testField.setText((ft.getText().matches(".*[a-z].*") ? "" : "not ") + "found");