只是想知道为什么会这样,而不是它是一个很大的问题。
我有一个类JDecimalField
,它扩展了JTextField
。我修改了此类中的createDefaultModel()
代码,因此它返回一个自定义Document
,只会写入数字输入(1到9以及'。')。
创建了我所拥有的代码的快速SSCCE,原谅肮脏:
import java.io.Serializable;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
public class TestField{
public static void main(String args[]){
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JDecimalField field = new JDecimalField();
frame.add(field);
frame.pack();
frame.setVisible(true);
}
public static class JDecimalField extends JTextField{
public JDecimalField() {
super();
}
@Override
protected Document createDefaultModel() {
String[] inputs = {"1", "2", "3", "4","5","6","7","8","9", "0", "."};
return new RestrictedDocument(inputs);
}
public int getValue() throws NumberFormatException{
return Integer.parseInt(getText());
}
}
public static class RestrictedDocument extends PlainDocument implements Serializable {
private final String[] charList;
public RestrictedDocument(String[] charList){
this.charList = charList;
}
public boolean validate(String exp){
for (String charList1 : charList) {
if (exp.equals(charList1)) {
return true;
}
}
return false;
}
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
if (validate(str)){
super.insertString(offs, str, a);
}
}
}
}
我只是想知道RestrictedDocument
中哪些内容不接受 ctrl + v 操作?能够这样做会很好,但我可以没有它。
在提到它之前,是的,我考虑使用JFormattedTextField
。我通常这样做,就我而言,我无法完成当前的任务。不过我不介意,详细阐述我对Java的了解。
答案 0 :(得分:3)
解决方案很简单:
例如:
DocumentFilter Example 1
DocumentFilter Example 2
修改强>
你的问题在于你的验证方法:它会允许“3”,因为它在列表中,但不允许“33”,因为它不在列表中。