为了账号安全,请及时绑定邮箱和手机立即绑定

JTextField 需要两倍的输入,但为什么呢?

JTextField 需要两倍的输入,但为什么呢?

手掌心 2021-08-25 15:15:07
我想做一个可编程计算器,我有基本的 GUI,现在我正在尝试设置按钮和显示器。我的显示文本基本上是“0”,如果用户输入一个数字,则应该显示该数字。我试图用 KeyListener 来做,但如果我按下一个键,它会显示两次。为什么? textField.addKeyListener(new KeyListener(){        boolean newNumber = true;        public void keyTyped(KeyEvent e) {        }        public void keyPressed(KeyEvent e) {            int keyCode = e.getKeyCode();            if(keyCode == e.VK_BACK_SPACE && textField.getText().length() == 1){                textField.setText("0");                newNumber = true;                }            if(textField.getText().equals("0") && newNumber){                textField.setText(KeyEvent.getKeyText(keyCode));                newNumber = false;            }        }        public void keyReleased(KeyEvent e) {        }    });输入前:“1”输入后:
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

为了做到这一点,我派生出这样的PlainDocument:


import java.awt.EventQueue;

import java.util.regex.Pattern;


import javax.swing.JTextField;

import javax.swing.text.AttributeSet;

import javax.swing.text.BadLocationException;

import javax.swing.text.PlainDocument;


public class DigitDocument extends PlainDocument {


    private static final long       serialVersionUID    = 1L;

    protected static final Pattern  patternStartZero    = Pattern.compile("^0.+");


    protected final JTextField      textField;


    private final int               limit;

    private final Runnable          runnableFormat;


    public DigitDocument(JTextField textField, int limit) {


        super();


        this.textField = textField;

        this.limit = limit;


        runnableFormat = new Runnable() {


            @Override

            public void run() {


                String text = textField.getText();


                if (text.length() == 0) {

                    textField.setText("0");

                }

                else if (patternStartZero.matcher(text).matches()) {

                    textField.setText(text.replaceAll("^0+", ""));

                }

            }

        };

    }


    @Override

    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {


        str = str.replaceAll("[^0-9]", "");


        if (str.length() == 0)

            return;


        else if ((getLength() + str.length()) <= limit)

            super.insertString(offset, str, attr);


        EventQueue.invokeLater(runnableFormat);

    }


    @Override

    public void remove(int offs, int len) throws BadLocationException {

        if (!"0".equals(textField.getText()))

            super.remove(offs, len);


        EventQueue.invokeLater(runnableFormat);

    }

}

用法是:


textField.setDocument(new DigitDocument(textField, 10));

textField.setText("0");

在数字文档中,

  • 第一个参数是 JTextField 本身。

  • 第二个参数 (10) 是最大输入长度,您只能输入数字。


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 224 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信