【问题标题】:Make JTextField accept only one digit使 JTextField 只接受一位数字
【发布时间】:2013-12-22 19:10:45
【问题描述】:

我正在开发一个数独小程序,我想制作它的单元格(扩展 JTextField),以便它只接受 0-9 和长度为 1 之间的整数。稍后我会进一步限制它(所以它符合游戏规则)。我是这样开始的:

    public Block(int[] blockNum){
        this.setLayout(new GridLayout(3,3));
        this.setBorder(new LineBorder(Color.BLACK,2)); 
        for(int i=0; i<CELL_COUNT; i++){
            cells[i] = new Cell(); // Cell extends JTextField
            ((AbstractDocument)cells[i].getDocument()).setDocumentFilter(
                    new MyDocumentFilter()); // <- this is relevant for this question

            if(blockNum[i]!=0){
                cells[i].setNumber(blockNum[i]);
                cells[i].setEditable(false);
            }
            this.add(cells[i]);
        }
    }
}

我在这里尝试过滤输入,一开始我只是尝试将其限制为整数和一位数字,但似乎我可以输入任意多的数字并且最后一行没有被触发。

在这里需要一些帮助,谢谢:

class MyDocumentFilter extends DocumentFilter
{   
    @Override
    public void replace(DocumentFilter.FilterBypass fp, int offset
                    , int length, String string, AttributeSet aset)
                                        throws BadLocationException
    {
        int len = string.length();
        boolean isValidInteger = true;
        if (len>1 || !Character.isDigit(string.charAt(0))) isValidInteger = false;


        if (isValidInteger)
            super.replace(fp, offset, length, string, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }
}

【问题讨论】:

标签: java swing jtextfield documentfilter


【解决方案1】:

尝试使用 DocumentFilter 类。这将允许您在实际显示之前检查输入。您还可以编辑我在下面的内容以仅检查整数。

JTextField tf = new JTextField();
AbstractDocument d = (AbstractDocument) tf.getDocument();
d.setDocumentFilter(new DocumentFilter(){
    int max = 1;

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        int documentLength = fb.getDocument().getLength(); 
            if (documentLength - length + text.length() <= max)
        super.replace(fb, offset, length, text.toUpperCase(), attrs);
    }
});

【讨论】:

  • 谢谢你,你能解释一下为什么我需要 insertString 方法吗?似乎只有 replace 方法在这里有效
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2013-01-16
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2011-04-17
相关资源
最近更新 更多