具有customDefaultModel覆盖的JTextField不允许粘贴

时间:2014-04-10 19:52:53

标签: java swing jtextfield

只是想知道为什么会这样,而不是它是一个很大的问题。


问题

我有一个类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);
            }     
        }       
    }

}

我的问题/ TL; DR:

我只是想知道RestrictedDocument中哪些内容不接受 ctrl + v 操作?能够这样做会很好,但我可以没有它。

在提到它之前,是的,我考虑使用JFormattedTextField。我通常这样做,就我而言,我无法完成当前的任务。不过我不介意,详细阐述我对Java的了解。

1 个答案:

答案 0 :(得分:3)

解决方案很简单:

  • 使用JFormattedTextField(如您所知)或
  • 使用DocumentFilter。

例如:
DocumentFilter Example 1
DocumentFilter Example 2

教程:
DocumentFilter Tutorial


修改
你的问题在于你的验证方法:它会允许“3”,因为它在列表中,但不允许“33”,因为它不在列表中。