将正则表达式实现为JFormattedTextField

时间:2015-09-25 16:11:48

标签: java regex

我想在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);
    }
}

但它不起作用(继续显示“未找到”)。有办法做到这一点吗?因为我已经练习了一段时间,所以使用正则表达式感觉更舒服。

2 个答案:

答案 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");