亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號