JTextArea는 JTextComponent의 하위 클래스로, 여러 줄의 텍스트를 표시하거나 사용자가 직접 텍스트를 입력할 수 있도록 지원하는 멀티라인 텍스트 컴포넌트입니다. 또한 JTextArea는 캐럿(커서) 위치 변경 이벤트를 감지할 수 있는 CaretListener 인터페이스를 생성할 수 있습니다.
기본적으로 JTextArea는 줄 번호를 제공하지 않기 때문에, 줄 번호를 표시하려면 DocumentListener 인터페이스를 활용해 코드를 직접 구현해야 합니다. 문서 내용이 삽입, 삭제, 변경될 때마다 리스너가 이를 감지하여 줄 번호 영역을 갱신하는 방식으로 동작합니다.
구현 예제
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.Element;
public class LineNumberTextAreaTest extends JFrame {
private static JTextArea textArea;
private static JTextArea lines;
private JScrollPane jsp;
public LineNumberTextAreaTest() {
setTitle("LineNumberTextArea Test");
jsp = new JScrollPane();
textArea = new JTextArea();
lines = new JTextArea("1");
lines.setBackground(Color.LIGHT_GRAY);
lines.setEditable(false);
// JTextArea 내부에 줄 번호를 구현하는 코드
textArea.getDocument().addDocumentListener(new DocumentListener() {
public String getText() {
int caretPosition = textArea.getDocument().getLength();
Element root = textArea.getDocument().getDefaultRootElement();
String text = "1" + System.getProperty("line.separator");
for(int i = 2; i < root.getElementIndex(caretPosition) + 2; i++) {
text += i + System.getProperty("line.separator");
}
return text;
}
@Override
public void changedUpdate(DocumentEvent de) {
lines.setText(getText());
}
@Override
public void insertUpdate(DocumentEvent de) {
lines.setText(getText());
}
@Override
public void removeUpdate(DocumentEvent de) {
lines.setText(getText());
}
});
jsp.getViewport().add(textArea);
jsp.setRowHeaderView(lines);
add(jsp);
setSize(400, 275);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new LineNumberTextAreaTest();
}
}코드 핵심 포인트
- DocumentListener 등록: textArea의 Document에 리스너를 추가하여 텍스트가 입력되거나 삭제될 때마다 줄 번호를 자동으로 갱신합니다.
- 줄 번호 계산: getDefaultRootElement()로 문서의 루트 요소를 가져온 뒤, getElementIndex() 메서드로 현재 캐럿 위치까지의 줄 수를 계산합니다.
- RowHeaderView 활용: JScrollPane의 setRowHeaderView() 메서드를 사용해 편집 불가능한 별도의 JTextArea를 행 헤더 영역에 배치함으로써 줄 번호 패널처럼 보이게 만듭니다.
실행 결과
위 코드를 실행하면 왼쪽에 회색 배경의 줄 번호 영역이 표시되고, 텍스트를 입력하거나 줄을 추가·삭제할 때마다 줄 번호가 실시간으로 업데이트되는 것을 확인할 수 있습니다.
