Как взять только строчные буквы и цифры и поместить их в отдельные текстовые поля? - PullRequest
0 голосов
/ 04 августа 2020

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

public class keyEventing extends JFrame implements KeyListener {

JPanel panel1 = new JPanel ();
JTextField textfield1 = new JTextField ("Numbers");
JTextField textfield2 = new JTextField ("Lower-case letters");

public keyEventing(){
    super("Write Numbers & Lower Case Letters only!");

    add(panel1);
    panel1.add(textfield1);
    panel1.add(textfield2);
    
    panel1.setLayout(new GridLayout (2,0));
    
    addKeyListener(this);
    
}
@Override 
public void keyTyped (KeyEvent event){
    char c = event.getKeyChar();
    
    if (c > 0 && c < 9)
        textfield1.setText(String.format("%c", c));

    if (c >= 'a' && c <= 'z')
        textfield2.setText(String.format("%c", c));
}
@Override
public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub
    
}
@Override
public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub
    
}

}

1 Ответ

0 голосов
/ 04 августа 2020

Для меня это не имеет смысла. Когда пользователь вводит данные в текстовое поле, он ожидает, что ввод будет выполнен в текстовом поле с фокусом, а не в каком-либо другом рядом с ним. Я предлагаю вам еще раз подумать, хотите ли вы это сделать, с точки зрения пользовательского опыта. Это нормально, если вы хотите, чтобы в текстовом поле были только числа, а в другом - только буквы. Я бы использовал JSpinner для текстового поля с единственными числами и использовал DocumentFilter с тем, что мне нужны только буквы.

Я упоминаю DocumentFilter , потому что это - это правильный способ фильтрации ввода, вводимого в текстовое поле. A KeyListener имеет много fl aws, когда дело доходит до фильтрации текста (что, если пользователь вставляет текст? Он нажимает только Control + V, а не фактические буквы клавиатуры). Даже если это возможно, для этого потребуется много (много) усилий.

Однако, если вы настаиваете на этом, вот пример этого (я не думаю, что это именно то, что вы ищу, но думаю, его близко):

public class TextFieldsExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout());

            JTextField onlyDigitsTextField = new JTextField(15);
            JTextField onlyLettersTextField = new JTextField(15);

            AbstractDocument onlyNumbersDocument = (AbstractDocument) onlyDigitsTextField.getDocument();
            AbstractDocument onlyLettersDocument = (AbstractDocument) onlyLettersTextField.getDocument();
            onlyNumbersDocument.setDocumentFilter(new DocumentFilter() {
                @Override
                public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
                        throws BadLocationException {
                    //Keep only digits
                    StringBuilder sb = new StringBuilder();
                    text.chars().mapToObj(i -> (char) i).filter(Character::isDigit).forEach(sb::append);
                    super.replace(fb, offset, length, sb.toString(), attrs);

                    //now "give" letters to only letters textField
                    sb = new StringBuilder();
                    text.chars().mapToObj(i -> (char) i).filter(Character::isLetter).forEach(sb::append);
                    onlyLettersDocument.insertString(onlyLettersTextField.getText().length(), sb.toString(), attrs);
                }

            });
            onlyLettersDocument.setDocumentFilter(new DocumentFilter() {
                @Override
                public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
                        throws BadLocationException {
                    StringBuilder sb = new StringBuilder();
                    text.chars().mapToObj(i -> (char) i).filter(Character::isLetter).forEach(sb::append);
                    super.replace(fb, offset, length, sb.toString(), attrs);

                    sb = new StringBuilder();
                    text.chars().mapToObj(i -> (char) i).filter(Character::isDigit).forEach(sb::append);
                    onlyNumbersDocument.insertString(onlyDigitsTextField.getText().length(), sb.toString(), attrs);
                }
            });

            frame.add(new JLabel("Only letters:"));
            frame.add(onlyLettersTextField);

            frame.add(Box.createRigidArea(new Dimension(50, 0)));

            frame.add(new JLabel("Only Digits:"));
            frame.add(onlyDigitsTextField);

            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        });
    }
}
...