猿问

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

我想做一个可编程计算器,我有基本的 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”输入后:

http://img4.mukewang.com/6125ee1c000160fc02040059.jpg


手掌心
浏览 225回答 2
2回答

海绵宝宝撒

为了做到这一点,我派生出这样的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 {&nbsp; &nbsp; private static final long&nbsp; &nbsp; &nbsp; &nbsp;serialVersionUID&nbsp; &nbsp; = 1L;&nbsp; &nbsp; protected static final Pattern&nbsp; patternStartZero&nbsp; &nbsp; = Pattern.compile("^0.+");&nbsp; &nbsp; protected final JTextField&nbsp; &nbsp; &nbsp; textField;&nbsp; &nbsp; private final int&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;limit;&nbsp; &nbsp; private final Runnable&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; runnableFormat;&nbsp; &nbsp; public DigitDocument(JTextField textField, int limit) {&nbsp; &nbsp; &nbsp; &nbsp; super();&nbsp; &nbsp; &nbsp; &nbsp; this.textField = textField;&nbsp; &nbsp; &nbsp; &nbsp; this.limit = limit;&nbsp; &nbsp; &nbsp; &nbsp; runnableFormat = new Runnable() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String text = textField.getText();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (text.length() == 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; textField.setText("0");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if (patternStartZero.matcher(text).matches()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; textField.setText(text.replaceAll("^0+", ""));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {&nbsp; &nbsp; &nbsp; &nbsp; str = str.replaceAll("[^0-9]", "");&nbsp; &nbsp; &nbsp; &nbsp; if (str.length() == 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; else if ((getLength() + str.length()) <= limit)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super.insertString(offset, str, attr);&nbsp; &nbsp; &nbsp; &nbsp; EventQueue.invokeLater(runnableFormat);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public void remove(int offs, int len) throws BadLocationException {&nbsp; &nbsp; &nbsp; &nbsp; if (!"0".equals(textField.getText()))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super.remove(offs, len);&nbsp; &nbsp; &nbsp; &nbsp; EventQueue.invokeLater(runnableFormat);&nbsp; &nbsp; }}用法是:textField.setDocument(new DigitDocument(textField, 10));textField.setText("0");在数字文档中,第一个参数是 JTextField 本身。第二个参数 (10) 是最大输入长度,您只能输入数字。
随时随地看视频慕课网APP

相关分类

Java
我要回答