Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Swing JTextArea에 줄 번호 표시하는 방법 완벽 가이드

JTextAreaJTextComponent의 하위 클래스로, 여러 줄의 텍스트를 표시하거나 사용자가 직접 텍스트를 입력할 수 있도록 지원하는 멀티라인 텍스트 컴포넌트입니다. 또한 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를 행 헤더 영역에 배치함으로써 줄 번호 패널처럼 보이게 만듭니다.

실행 결과

위 코드를 실행하면 왼쪽에 회색 배경의 줄 번호 영역이 표시되고, 텍스트를 입력하거나 줄을 추가·삭제할 때마다 줄 번호가 실시간으로 업데이트되는 것을 확인할 수 있습니다.

Java Swing JTextArea에 줄 번호 표시하는 방법 완벽 가이드