Swing에서 JTextField는 일반 텍스트(plain text) 입력에 사용되는 반면, JFormattedTextField는 JTextField를 확장한 클래스로, 텍스트에 원하는 형식(format)을 지정할 수 있습니다. 대표적으로 전화번호, 이메일, 날짜 등의 형식을 적용할 때 활용됩니다.
JTextField란?
- JTextField는 사용자가 한 줄(single line) 형태로 텍스트를 입력할 수 있게 해주는 Swing의 핵심 컴포넌트 중 하나입니다.
- 텍스트 필드에 입력이 발생하면 ActionListener 인터페이스가 이벤트를 생성하고, 캐럿(커서) 위치가 변경될 때마다 CaretListener 인터페이스가 호출됩니다.
- 또한 MouseListener와 KeyListener 인터페이스도 함께 사용할 수 있어 마우스 클릭이나 키보드 입력에 대한 처리도 가능합니다.
JTextField 예제
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JTextFieldTest extends JFrame {
JTextField jtf;
public JTextFieldTest() {
setTitle("JTextField Test");
setLayout(new FlowLayout());
jtf = new JTextField(15);
add(jtf);
jtf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Event generated: " + jtf.getText());
}
});
setSize(375, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String args[]) {
new JTextFieldTest();
}
}
위 예제는 15자 크기의 텍스트 필드를 생성합니다. 필드에서 Enter 키를 누르면 ActionEvent가 발생하여 입력된 텍스트가 콘솔에 출력됩니다.
실행 결과

JFormattedTextField란?
- 형식화된 텍스트 필드(formatted text field)는 JFormattedTextField 클래스의 인스턴스로, JTextField의 직접적인 하위 클래스입니다.
- JFormattedTextField는 일반 텍스트 필드와 비슷하지만, 사용자가 입력하는 문자의 유효성(validity)을 검증할 수 있으며, 입력 가능한 문자를 지정하는 포매터(formatter)와 연결할 수 있다는 점이 다릅니다.
- Format 클래스를 기반으로 형식화된 텍스트 필드를 만들 수 있습니다. 먼저 포매터를 생성하고 필요에 따라 커스터마이징한 후, Format 타입의 인자를 받는 JFormattedTextField(Format format) 생성자를 호출하면 됩니다.
JFormattedTextField 예제
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class JFormattedTextFieldTest extends JFrame {
JFormattedTextField jftf;
MaskFormatter mf;
public JFormattedTextFieldTest() {
setTitle("JFormattedTextField Test");
setLayout(new FlowLayout());
// 전화번호 포매터 - (국가 코드)-(지역 코드)-(전화 번호)
try {
mf = new MaskFormatter("##-###-#######");
mf.setPlaceholderCharacter('#');
jftf = new JFormattedTextField(mf);
jftf.setColumns(12);
} catch(Exception e) {
e.printStackTrace();
}
add(jftf);
setSize(375, 250);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]) {
new JFormattedTextFieldTest();
}
}
위 예제에서는 MaskFormatter를 사용하여 국가 코드-지역 코드-번호 순서의 전화번호 형식을 지정했습니다. 사용자는 '#' 자리에 해당하는 패턴에 맞춰서만 입력할 수 있으므로 잘못된 형식의 데이터가 입력되는 것을 사전에 방지할 수 있습니다.
실행 결과

핵심 차이점 요약
| 구분 | JTextField | JFormattedTextField |
|---|---|---|
| 입력 값 | 자유로운 일반 텍스트 | 지정된 형식의 텍스트 |
| 유효성 검증 | 기본 제공되지 않음 | 포매터를 통한 검증 지원 |
| 상속 관계 | JTextComponent의 하위 클래스 | JTextField의 직접적인 하위 클래스 |
| 주요 활용 | 검색어, 이름, 메모 등 | 전화번호, 날짜, 이메일 등 |
정리하면, 단순한 텍스트 입력에는 JTextField를, 입력 형식 지정과 유효성 검증이 필요한 경우에는 JFormattedTextField를 사용하는 것이 바람직합니다.