it-swarm.com.ru

Принимать только цифры и точки в Java TextField

У меня есть одно textField, где я принимаю только цифры с клавиатуры, но теперь я должен изменить его, так как это «цена textField», и мне также нужно будет принять точку ».» по любым ценам.

Как я могу изменить это, чтобы получить то, что мне нужно?

ptoMinimoField = new JTextField();
        ptoMinimoField.setBounds(348, 177, 167, 20);
        contentPanel.add(ptoMinimoField);
        ptoMinimoField.setColumns(10);
        ptoMinimoField.addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                char caracter = e.getKeyChar();
                if (((caracter < '0') || (caracter > '9'))
                        && (caracter != '\b')) {
                    e.consume();
                }
            }
        });
8
Agustín

Как предлагает Oracle, Используйте поля форматированного текста

Отформатированные текстовые поля предоставляют разработчикам возможность указать допустимый набор символов, который можно вводить в текстовом поле. 

amountFormat = NumberFormat.getNumberInstance();
...
amountField = new JFormattedTextField(amountFormat);
amountField.setValue(new Double(amount));
amountField.setColumns(10);
amountField.addPropertyChangeListener("value", this);
11
Suresh Atta

JTextField txField = new DoubleJTextField ();

Создайте файл DoubleJTextField.Java и будьте счастливы

public class DoubleJTextField extends JTextField {
    public DoubleJTextField(){
        addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                char ch = e.getKeyChar();

                if (!isNumber(ch) && !isValidSignal(ch) && !validatePoint(ch)  && ch != '\b') {
                    e.consume();
                }
            }
        });

    }

    private boolean isNumber(char ch){
        return ch >= '0' && ch <= '9';
    }

    private boolean isValidSignal(char ch){
        if( (getText() == null || "".equals(getText().trim()) ) && ch == '-'){
            return true;
        }

        return false;
    }

    private boolean validatePoint(char ch){
        if(ch != '.'){
            return false;
        }

        if(getText() == null || "".equals(getText().trim())){
            setText("0.");
            return false;
        }else if("-".equals(getText())){
            setText("-0.");
        }

        return true;
    }
}
6
Wender

Я просто использую блок try-catch

try {// if is number
    Integer.parseInt(String);
} catch (NumberFormatException e) {
    // else then do blah
}
5
Brayan Byrdsong

Никогда не используйте KeyListener для этого. В приведенном выше коде есть две серьезные ошибки, каждая из которых вызвана использованием KeyListener. Во-первых, он пропустит любой вставленный текст. Всякий раз, когда я нахожу поле, отфильтровывающее нецифровые символы, я всегда стараюсь вставить какой-то текст, просто для удовольствия. В девяти случаях из десяти текст принимается, потому что они используют ключевой слушатель. 

Во-вторых, вы не отфильтровали модификаторы. Если пользователь попытается сохранить свою работу, набрав control-s, пока они находятся в этом поле, ваш ключевой слушатель будет использовать событие. И если ваше приложение назначает, скажем, ярлык control-5 или alt-5 для какого-либо действия, этот KeyListener добавит 5 к полю при вводе, даже если пользователь не пытался набрать символ. Вы выяснили, что вам нужно передать клавишу возврата, но это еще не все, что вам нужно пройти. Ваши клавиши со стрелками не будут работать. Также не будут ваши функциональные клавиши. Вы можете исправить все эти проблемы, но это требует много работы.

Есть третий недостаток, но он проявляется только в том случае, если вы адаптируете свое приложение к иностранному алфавиту, особенно к тому, который требует нескольких нажатий клавиш для создания одного символа, например китайского. Эти алфавиты делают KeyListeners бесполезными.

Беда в этом. Вы должны фильтровать символы, но KeyListeners - это не символы, а нажатия клавиш, что не одно и то же: не все нажатия клавиш генерируют символы, и не все символы генерируются нажатием клавиш. Вам нужен подход, который рассматривает символы после того, как они были сгенерированы, и после того, как измененные нажатия клавиш уже отфильтрованы.

Самый простой подход - использовать JFormattedTextField, но мне никогда не нравился этот подход, потому что он не форматирует и не фильтрует при вводе. Поэтому вместо этого я буду использовать DocumentFilter. Фильтры DocumentFilter не работают с нажатиями клавиш, они работают с текстовыми строками, когда они вставляются в модель данных вашего JTextField. Следовательно, все управляющие клавиши, стрелки и функциональные клавиши и тому подобное даже не достигают DocumentFilter. Весь вставленный текст также проходит через DocumentFilter. И для языков, которым требуется три нажатия клавиш для генерации одного символа, DocumentFilter не вызывается, пока символ не будет сгенерирован. Вот как это выглядит:

    ptoMinimoField = new JTextField();
    ptoMinimoField.setBounds(348, 177, 167, 20); // Don't do this! See below.
    contentPanel.add(ptoMinimoField);
    ptoMinimoField.setColumns(10);

    PlainDocument document = (PlainDocument) ptoMinimoField.getDocument();
    document.setDocumentFilter(new DigitFilter());
}

Класс DigitFilter выглядит так:

public class DigitFilter extends DocumentFilter {
    @Override
    public void insertString(FilterBypass fb, int offset, String text, 
            AttributeSet attr) throws BadLocationException {
        super.insertString(fb, offset, revise(text), attr);
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text,
                        AttributeSet attrs) throws BadLocationException {
        super.replace(fb, offset, length, revise(text), attrs);
    }

    private String revise(String text) {
        StringBuilder builder = new StringBuilder(text);
        int index = 0;
        while (index < builder.length()) {
            if (accept(builder.charAt(index))) {
                index++;
            } else {
                // Don't increment index here, or you'll skip the next character!
                builder.deleteCharAt(index);
            }
        }
        return builder.toString();
    }

    /**
     * Determine if the character should remain in the String. You may
     * override this to get any matching criteria you want. 
     * @param c The character in question
     * @return true if it's valid, false if it should be removed.
     */
    public boolean accept(final char c) {
        return Character.isDigit(c) || c == '.';
    }
}

Вы можете написать это как внутренний класс, но я создал отдельный класс, чтобы вы могли переопределить метод accept (), чтобы использовать любые критерии, которые вы хотите. Вы также можете заметить, что я не проверяю цифры, написав это:

(c < '0') || (c > '9')

Вместо этого я делаю это:

Character.isDigit()

Это быстрее, чище и работает с зарубежными системами нумерации. Мне также не нужен ваш тест для символа возврата,\b. Я предполагаю, что ваш первый KeyListener отфильтровывал клавишу возврата, что было вашей первой подсказкой, что это был неправильный подход.

И на несвязанной ноте, не жестко кодируйте свои позиции компонентов. Узнайте, как использовать LayoutManager. Их легко использовать, и они сделают ваш код намного проще в обслуживании.

3
MiguelMunoz

Вы смотрели на JFormattedTextField? Казалось бы, он делает то, что вы хотите.

2
arcy

Введите двойное число JTextField в Java

private boolean dot = false;
private void txtMarkKeyTyped(Java.awt.event.KeyEvent evt) {                                 
    char vChar = evt.getKeyChar();
    if (txtMark.getText().equals(""))
        dot = false;
    if (dot == false){
        if (vChar == '.') dot = true;
        else if (!(Character.isDigit(vChar)
                || (vChar == KeyEvent.VK_BACK_SPACE)
                || (vChar == KeyEvent.VK_DELETE))) {
                evt.consume();
        }
    } else {
        if (!(Character.isDigit(vChar)
                || (vChar == KeyEvent.VK_BACK_SPACE)
                || (vChar == KeyEvent.VK_DELETE))) {
                evt.consume();
        }
    }
}
1
Vũ Trung Sơn

Этот бит кода;

if (((caracter < '0') || (caracter > '9'))
                    && (caracter != '\b')) {

решает, использовать ли ключевое событие. Вам необходимо обновить условие, чтобы оно не использовало символ точки.

1
Qwerky
JTextField txtMyTextField = new JTextField();

numOnly(txtMyTextField);

public void numOnly(Object objSource){
    ((Component) objSource).addKeyListener(new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e) {
            String filterStr = "0123456789.";
            char c = (char)e.getKeyChar();
            if(filterStr.indexOf(c)<0){
                e.consume();
            }
        }
        @Override
        public void keyReleased(KeyEvent e) {}

        @Override
        public void keyPressed(KeyEvent e) {}
    });
}

ВНИМАНИЕ: Эта функция не соответствует надлежащей документации Java руководство.

1
kulakesh

Я использовал это решение, оно простое и эффективное:

                jtextfield.addKeyListener(new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                    char vChar = e.getKeyChar();
                    if (!(Character.isDigit(vChar)
                            || (vChar == KeyEvent.VK_BACK_SPACE)
                            || (vChar == KeyEvent.VK_DELETE))) {
                        e.consume();
                    }
                }
            });
0
Abdellah Benhammou
JTextField textField = new JTextField();
textField.setColumns(10);

textField.addKeyListener(new KeyAdapter() {
    @Override
    public void KeyTyped(KeyEvent e) {
        if (!(e.getKeyChar() >= '0' && e.getKeyChar() <= '9')) {
            e.consume();
        }
    }
})

это самый простой метод, который я нашел, и он работает без каких-либо ошибок

0
Kickass Kicchu

/////////////

    JTextField ptoMinimoField = new JTextField();
    ptoMinimoField.addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e) {
             boolean ret = true;
                try {

                    Double.parseDouble(ptoMinimoField.getText()+e.getKeyChar());
                }catch (NumberFormatException ee) {
                    ret = false;
                }


            if (!ret) {
                e.consume();
            }
        }
    });
0
Alireza Ravandi
private boolean point = false;
private void txtProductCostPriceAddKeyTyped(Java.awt.event.KeyEvent evt)   
{
    char Char = evt.getKeyChar();
    if (txtProductCostPriceAdd.getText().equals(""))
        point = false;
    if (point == false){
        if (Char == '.') point = true;
        else if (!(Character.isDigit(Char) || (Char == KeyEvent.VK_BACK_SPACE) || (Char == KeyEvent.VK_DELETE))) {
                evt.consume();
        }
    } else {
        if (!(Character.isDigit(Char) || (Char == KeyEvent.VK_BACK_SPACE) || (Char == KeyEvent.VK_DELETE))) {
                evt.consume();
        }
    }
}
0
Noiwong Suwijak

может быть, может помочь вам для фильтрации набранных просто номер и точка

public void filterHanyaAngkaDot(Java.awt.event.KeyEvent evt){
      char c = evt.getKeyChar();
      if (! ((Character.isDigit(c) ||
              (c == KeyEvent.VK_BACK_SPACE) ||
              (c == KeyEvent.VK_DELETE))
              )&& c==KeyEvent.VK_COMMA
              )
      {
          evt.consume();
      }
 }
0
irbef