Как принимать только числовые значения от 0 до 8 в JTextfied?

Я хочу, чтобы мое jtextfield принимало только числовые значения от 0 до значения MAX, указанного в приведенном ниже примере кода.

Допустим, для переменной MAX установлено значение 8, как показано ниже. Затем я просто хочу, чтобы можно было ввести числовое значение от 0 до 8. В моем примере кода ниже вы можете ввести 88, 77, 66 и т. д., и это не должно быть возможно. Я понятия не имею, как я могу сделать так, чтобы он принимал значения только от 0 до MAX.

import javax.swing.*;
import javax.swing.text.*;

public class DocumentDemo extends JFrame {
    public static void main(String[] args) {
        new DocumentDemo();
    }

    final int MAX = 8;

    public DocumentDemo() {
        this.setVisible(true);
        JTextField textField = new JTextField();

        ((AbstractDocument)textField.getDocument()).setDocumentFilter(
                new DocumentFilter() {

                    @Override
                    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                        int len = text.length();
                        boolean isValidValue = true;
                        for(int i = 0; i < len; i++) {
                            if(!Character.isDigit(text.charAt(i))){
                                isValidValue = false;
                            }
                        }

                        if(isValidValue && Integer.parseInt(text) > MAX) {
                            isValidValue = false;
                        }

                        if(isValidValue && fb.getDocument().getText(0, fb.getDocument().getLength()).length() > String.valueOf(MAX).length()) {
                            isValidValue = false;
                        }

                        if(isValidValue) {
                            super.replace(fb, offset, length, text, attrs);
                        }
                    }
                }
        );
        textField.setColumns(5);
        this.add(textField);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
    }
}

person Rox    schedule 23.06.2014    source источник
comment
Возможно, вы захотите использовать JSpinner, поскольку у вас так мало допустимых значений.   -  person Gilbert Le Blanc    schedule 24.06.2014
comment
Значение выше является примером. Это может быть и 12345. Но я выбрал низкое значение в моем примере выше. :-)   -  person Rox    schedule 24.06.2014
comment
"I have no clue how I can make it so it only accepts values between 0 and MAX." -- Фильтр документов будет работать. Ваше утверждение выше не помогает нам понять, где вы застряли. Пожалуйста, будьте конкретны в формулировке проблемы. Если вы выполните поиск на этом сайте по моему имени и DocumentFilter, вы найдете примеры того, как создаются эти ребята.   -  person Hovercraft Full Of Eels    schedule 24.06.2014
comment
Например, здесь. Просто напишите соответствующий test(...) метод, соответствующий вашим критериям. Я уверен, что вы можете сделать это, если вы попробуете.   -  person Hovercraft Full Of Eels    schedule 24.06.2014


Ответы (2)


JFormattedTextField звучит как то, что вам нужно.

NumberFormatter nf = new NumberFormatter();  
nf.setMinimum(new Integer(0));  
nf.setMaximum(new Integer(8));  
JFormattedTextField field = new JFormattedTextField(nf);  

Редактировать: показано, как установить мин, макс

person sevensevens    schedule 23.06.2014
comment
Спасибо за ответ. Но я хочу запретить пользователю вводить значение больше, чем значение MAX. - person Rox; 24.06.2014

Вы также можете использовать JSpinner или DocumentFilter (с примерами) в зависимости от ваших общих потребностей

DocumentFilter предоставит вам дополнительное преимущество в виде возможности фильтровать контент, поступающий в поле, в режиме реального времени.

person MadProgrammer    schedule 24.06.2014