自定义JTextfield - 仅限有限的整数

时间:2015-02-06 21:22:11

标签: java swing jtextfield

我有一个只允许有限数量的整数的类。问题是,类正在做它的工作但是当我使用多个对象时,它只接受最后一个对象限制数并适用于其他对象。

我也无法摆脱静态警告。

代码是;

public class LimitedIntegerTF extends JTextField {

    private static final long serialVersionUID = 1L;
    private static int limitInt;
    public LimitedIntegerTF() {
        super();
    }

    public LimitedIntegerTF(int limitInt) {
        super();
        setLimit(limitInt);
    }

    @SuppressWarnings("static-access")
    public final void setLimit(int newVal) 
    {
        this.limitInt = newVal;
    }

    public final int getLimit() 
    {
        return limitInt;
    }

    @Override
    protected Document createDefaultModel() {
        return new UpperCaseDocument();
    }

    @SuppressWarnings("serial")
    static class UpperCaseDocument extends PlainDocument {

        @Override
        public void insertString(int offset, String strWT, AttributeSet a)
                throws BadLocationException {

            if(offset < limitInt){
                if (strWT == null) {
                    return;
                }

                char[] chars = strWT.toCharArray();
                boolean check = true;

                for (int i = 0; i < chars.length; i++) {

                    try {
                        Integer.parseInt(String.valueOf(chars[i]));
                    } catch (NumberFormatException exc) {
                        check = false;
                        break;
                    }
                }

                if (check)
                    super.insertString(offset, new String(chars),a);

            }
        }
    }
}

我如何在另一个班级上调用它;

final LimitedIntegerTF no1 = new LimitedIntegerTF(5);
final LimitedIntegerTF no2 = new LimitedIntegerTF(7);
final LimitedIntegerTF no3 = new LimitedIntegerTF(10);

结果为no1no2no3(10)作为限制。

Example:
no1: 1234567890 should be max len 12345
no2: 1234567890 should be max len 1234567
no3: 1234567890 it's okay

1 个答案:

答案 0 :(得分:2)

这是因为您的limitIntstatic,这意味着它对该类的所有实例(What does the 'static' keyword do in a class?)具有相同的值。使其成为非静态的,并且您的类的每个实例都有自己的值。

如果要在内部类limitInt中使用UpperCaseDocument,那么也要使该类非静态。但是,如果您这样做,UpperCaseDocument的每个实例也会有与之关联的LimitedIntegerTF实例。