0
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 中键入任何数值,但如果他这样做了,那么我试图仅在运行时将其删除.. 我写了这段代码,但它没有像我预期的那样工作.. . 请帮帮我!!

4

2 回答 2

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调用。

于 2012-09-05T17:55:16.423 回答
0

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

您可以覆盖这样的paintComponent()方法JTextField

JTextField textField = new JTextField(text) {

@Override
protected void paintComponent(Graphics grphcs) {
    super.paintComponent(grphcs);
    String newStr = "";
    for (char c : getText().toCharArray()) {
        if (!Character.isDigit(c)) {
            newStr += c;
        }
    }
    setText(newStr);

    }
};
于 2012-09-05T18:01:41.583 回答