Для меня это не имеет смысла. Когда пользователь вводит данные в текстовое поле, он ожидает, что ввод будет выполнен в текстовом поле с фокусом, а не в каком-либо другом рядом с ним. Я предлагаю вам еще раз подумать, хотите ли вы это сделать, с точки зрения пользовательского опыта. Это нормально, если вы хотите, чтобы в текстовом поле были только числа, а в другом - только буквы. Я бы использовал 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);
});
}
}