JTextField with customDefaultModel override doesn't allow pasting
只是想知道为什么会发生这种情况,而不是说这是一个大问题。
问题
我有一个扩展
创建了我拥有的代码的快速SSCCE,请原谅:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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); } } } } |
我的问题/ TL;博士:
我只是想知道我的
在提到它之前,是的,我已经考虑过使用
解决方案很简单:
- 使用JFormattedTextField(您已经知道)或
- 使用DocumentFilter。
例如:
DocumentFilter示例1
DocumentFilter示例2
对于教程:
DocumentFilter教程
编辑
您的问题出在您的validate方法中:因为该列表中有" 3 ",但由于不在列表中,因此它不允许" 33 "。