【问题标题】:Clear a typed character during runtime in jTextField在 jTextField 运行时清除键入的字符
【发布时间】:2012-09-05 16:42:27
【问题描述】:
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 中键入任何数值,但如果他这样做了,那么我将尝试仅在运行时将其删除....我编写了此代码,但它没有按我预期的那样工作是... 请帮帮我!!

【问题讨论】:

标签: java swing awt jtextfield keyevent


【解决方案1】:

您确实应该避免使用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 调用。

【讨论】:

    【解决方案2】:

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

    您可以像这样覆盖JTextFieldpaintComponent() 方法:

    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);
    
        }
    };
    

    【讨论】:

    • 亲爱的,不要,不要,不要,不要,用任何绘画方法改变 UI 组件,你最终会通过重复的重新绘画请求消耗 CPU
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多