关于java:带有customDefaultModel覆盖的JTextField不允许粘贴

JTextField with customDefaultModel override doesn't allow pasting

只是想知道为什么会发生这种情况,而不是说这是一个大问题。

问题

我有一个扩展JTextField的类JDecimalField。我已经修改了此类中的createDefaultModel()代码,因此它返回了一个自定义的Document,该自定义Document仅写数字输入(1到9以及'。')。

创建了我拥有的代码的快速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;博士:

我只是想知道我的RestrictedDocument中什么不接受ctrl v操作?能够这样做会很好,但是没有它我可以活下去。

在提到它之前,是的,我已经考虑过使用JFormattedTextField。我通常会这样做,就我而言,我不能胜任当前的工作。不过,我不介意,对我的Java知识进行了阐述。


解决方案很简单:

  • 使用JFormattedTextField(您已经知道)或
  • 使用DocumentFilter。

例如:
DocumentFilter示例1
DocumentFilter示例2

对于教程:
DocumentFilter教程

编辑
您的问题出在您的validate方法中:因为该列表中有" 3 ",但由于不在列表中,因此它不允许" 33 "。