JTextField란 무엇인가?
JTextField는 사용자가 한 줄(single line) 형식으로 텍스트 값을 입력할 수 있게 해주는 Java Swing의 핵심 컴포넌트 중 하나입니다. 실무에서는 아이디, 전화번호, 우편번호처럼 입력 길이가 정해진 필드의 경우, 사용자가 지정된 길이를 초과하여 입력하지 못하도록 제한해야 할 때가 많습니다.
이러한 문자 수 제한은 PlainDocument 클래스를 활용하면 간단하게 구현할 수 있습니다.
PlainDocument로 문자 수 제한하기
아래 예제에서는 PlainDocument 클래스를 상속받아 제한 로직을 구현합니다. 이렇게 하면 사용자가 최대 10자까지만 입력할 수 있으며, 10자를 초과하는 문자는 입력되지 않습니다.
핵심 동작 원리는 다음과 같습니다.
insertString()메서드를 오버라이드하여 텍스트가 문서에 삽입되기 전에 개입합니다.- 현재 문서 길이(
getLength())와 삽입하려는 문자열 길이의 합이 제한값(limit) 이하일 때만super.insertString()을 호출합니다. - 제한을 초과하는 입력은 자동으로 무시되므로, 별도의 경고 처리 없이도 깔끔하게 길이 제한이 적용됩니다.
예제 코드
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
class JTextFieldLimit extends PlainDocument {
private int limit;
JTextFieldLimit(int limit) {
super();
this.limit = limit;
}
JTextFieldLimit(int limit, boolean upper) {
super();
this.limit = limit;
}
public void insertString(int offset, String str, AttributeSet attr)
throws BadLocationException {
if (str == null)
return;
if ((getLength() + str.length()) <= limit) {
super.insertString(offset, str, attr);
}
}
}
public class JTextFieldLimitTest extends JFrame {
JTextField textfield;
JLabel label;
public static void main(String[] args) {
new JTextFieldLimitTest().GUI();
}
public void GUI() {
setLayout(new FlowLayout());
label = new JLabel("max 10 chars");
textfield = new JTextField(15);
add(label);
add(textfield);
// 텍스트 필드에 길이 제한 문서 적용
textfield.setDocument(new JTextFieldLimit(10));
setSize(350, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
코드 설명
JTextFieldLimit클래스는PlainDocument를 상속하며, 생성자를 통해 최대 입력 가능 문자 수인limit값을 전달받습니다.insertString()메서드에서 현재 문서에 저장된 문자 수와 새로 입력되는 문자 수를 합산하여 제한값과 비교한 후, 조건을 만족할 때만 실제 삽입을 수행합니다.JTextFieldLimitTest클래스에서는textfield.setDocument(new JTextFieldLimit(10))를 호출하여 해당 텍스트 필드에 10자 제한을 적용합니다.
실행 결과
프로그램을 실행하면 "max 10 chars"라는 라벨과 함께 텍스트 필드가 화면에 나타나며, 텍스트 필드에는 최대 10자까지만 입력됩니다. 11번째 문자부터는 입력 시도가 무시되므로, 별도의 유효성 검사 없이도 입력 길이가 일관되게 유지됩니다.
