在运行时在jTextField中清除键入的字符

时间:2012-09-05 16:42:27

标签: java swing awt jtextfield keyevent

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
int x=evt.getKeyCode();
if(x>=96&&x<=105)
  {
      evt.setKeyCode(8);//Here 8 is used for Backspace key to remove the numeric character entered
  }

Int这段代码我希望用户不要在jTextField中键入任何数值,但如果他这样做,那么我试图在运行时只删除它....我写了这段代码,但它没有工作,因为我期望它是... Plzz帮助我!!

2 个答案:

答案 0 :(得分:2)

你真的应该避免KeyListeners,它们对你最终想要达到的目标太有限制了,你只会在你尝试更改字段文档时最终会出现变异异常试图改变文件。

你真的应该使用DocumentFilter,这就是它的设计。

((AbstractDocument)field.getDocument()).setDocumentFilter(new DocumentFilter() {

    @Override
    public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {

        StringBuilder sb = new StringBuilder(64);
        for (char c : text.toCharArray()) {

            if (Character.isDigit(c)) {

                sb.append(c);

            }

        }

        fb.insertString(offset, text, attr);

    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {

        StringBuilder sb = new StringBuilder(64);
        for (char c : text.toCharArray()) {

            if (Character.isDigit(c)) {

                sb.append(c);

            }

        }

        fb.replace(offset, length, sb.toString(), attrs);

    }

});

这是一个非常基本的例子,SO上有很多。

除了避免突变异常之外,过滤器在到达文档/字段之前拦截更新,因此传入的更改将不会在屏幕上显示,您还可以捕获任何粘贴事件或setText调用。 / p>

答案 1 :(得分:0)

虽然也许不是最好的方法,但这是一种非常简单的方法。

您可以像这样覆盖paintComponent()的{​​{1}}方法:

JTextField