Применение ограниченного диапазона символов для кода jtextfield не работает - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать KeyEvent, чтобы ограничить символы в jTextField, которые он может принимать в качестве входных данных для события KeyTyped, используя следующий код:


private void userIDFieldKeyTyped(java.awt.event.KeyEvent evt) {                                     
        char c = evt.getKeyChar();
        if(c!=KeyEvent.VK_BACK_SPACE && c!=KeyEvent.VK_DELETE){
            if (Character.isLetter(c) && Character.isDigit(c)){
            } else {
                evt.consume();
            }
        }
    }

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

Редактировать: Под ограничением символов я имею в виду, что текстовое поле может принимать только те символы, которые я разрешил, а не то, чтобыпрекратить ввод данных после того, как определенное количество символов уже введено.

1 Ответ

0 голосов
/ 23 мая 2019

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

import java.awt.EventQueue;
import java.text.ParseException;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.text.MaskFormatter;

/**
 * For testing class {@code javax.swing.JFormattedTextField}
 */
public class FmTxtFld implements Runnable {
    private JFrame frame;
    private JFormattedTextField  fmtTxtFld;

    @Override // java.lang.Runnable
    public void run() {
        try {
            showGui();
        }
        catch (ParseException xParse) {
            xParse.printStackTrace();
        }
    }

    private void showGui() throws ParseException {
        frame = new JFrame("FmTxtFld");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        // Ten alphanumeric characters, i.e. letter or digit.
        MaskFormatter formatter = new MaskFormatter("AAAAAAAAAA"); //throws java.text.ParseException

        fmtTxtFld = new JFormattedTextField(formatter);
        fmtTxtFld.setColumns(10);
        JLabel label = new JLabel("JFormattedTextField");
        JPanel panel = new JPanel();
        panel.add(label);
        panel.add(fmtTxtFld);
        frame.add(panel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        FmTxtFld instance = new FmTxtFld();
        EventQueue.invokeLater(instance);
    }
}

Если вы запустите приведенный выше код, вы увидите, что текстовое поле отображает только действительные символы, т.е. только буквы и цифры, и также не будет приниматьболее 10 символов.

...