당신은 실제로 KeyListeners
을 피해야합니다, 그들은 당신이 궁극적으로 성취하고자하는 것에 너무 제한되어 있습니다. 필드가 시도하는 동안 필드 문서를 변경하려고 시도 할 때만 돌연변이 예외로 끝날 것입니다 문서를 변경하십시오. 당신은 정말 DocumentFilter를 사용한다
, 즉 그것의 설계 무엇입니다.
((AbstractDocument)field.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException {
StringBuilder sb = new StringBuilder(64);
for (char c : text.toCharArray()) {
if (Character.isDigit(c)) {
sb.append(c);
}
}
fb.insertString(offset, text, attr);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
StringBuilder sb = new StringBuilder(64);
for (char c : text.toCharArray()) {
if (Character.isDigit(c)) {
sb.append(c);
}
}
fb.replace(offset, length, sb.toString(), attrs);
}
});
이것은 정말 기본적인 예입니다.
돌연변이 예외를 제외하고 필터는 문서/필드에 도달하기 전에 업데이트를 가로 채므로 들어오는 변경 사항이 화면에 표시되지 않으며 붙여 넣기 이벤트 또는 setText
호출도 캡처합니다.
두 가지 다른 방법으로 같은 질문을하지 마십시오 이 질문을 첫 번째 질문과 병합하십시오. 의 – Dave
가능한 중복 (http://stackoverflow.com/questions/12285667/force-user-not-to-enter-numeric-entry-in-jtextfield- [* 강제로 사용자가 자바에서의 JTextField *에서 숫자 항목을 입력 할 수 없습니다] in-java). – trashgod