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

Java Swing JTable에서 셀 편집을 비활성화하는 방법

JTable은 복잡한 데이터 구조를 화면에 표시하기 위한 JComponent의 하위 클래스입니다. JTable은 MVC(Model View Controller) 디자인 패턴을 따르며, 데이터를 행과 열 형태로 깔끔하게 표시할 수 있습니다. 또한 TableModelListener, TableColumnModelListener, ListSelectionListener, CellEditorListener, RowSorterListener 인터페이스를 통해 다양한 테이블 이벤트를 처리할 수 있습니다.

기본적으로 JTable의 셀 안에서는 텍스트를 자유롭게 편집하고 수정할 수 있습니다. 하지만 조회 전용 테이블처럼 사용자가 데이터를 임의로 변경하지 못하도록 셀 편집을 비활성화해야 하는 경우가 있습니다. 이때는 JTable 클래스의 editCellAt() 메서드를 오버라이드하여 항상 false를 반환하도록 구현하면 됩니다. editCellAt()은 셀이 편집 모드로 전환되기 직전에 호출되는 메서드이므로, false를 반환하면 어떤 경우에도 편집이 시작되지 않습니다.

예제 코드

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public final class DisableJTableMouseClickTest extends JFrame {
    private JTable table;
    private JScrollPane scrollPane;

    public DisableJTableMouseClickTest() {
        setTitle("DisableJTableMouseClick Test");
        String[] columnNames = {"Country", "Rank"};
        Object[][] data = {{"England", "1"}, {"India", "2"},
                           {"New Zealand", "3"}, {"Australia", "4"},
                           {"South Africa", "5"}, {"Pakistan", "6"}};

        table = new JTable(data, columnNames) {
            public boolean editCellAt(int row, int column, java.util.EventObject e) {
                return false;
            }
        };
        table.setRowSelectionAllowed(false);

        scrollPane = new JScrollPane(table);
        add(scrollPane);
        setSize(400, 275);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        new DisableJTableMouseClickTest();
    }
}

실행 결과

Java Swing JTable에서 셀 편집을 비활성화하는 방법

코드 설명

위 예제에서는 익명 내부 클래스 방식으로 JTable을 생성하는 과정에서 editCellAt() 메서드를 오버라이드했습니다. 이 메서드가 항상 false를 반환하기 때문에 마우스 더블클릭이나 키보드 입력 등 어떤 방법으로도 셀이 편집 모드로 전환되지 않습니다. 결과적으로 테이블은 데이터를 단순히 조회하는 용도로만 동작합니다.

추가로 호출한 setRowSelectionAllowed(false)는 행 단위 선택을 비활성화하는 옵션입니다. 이 설정을 적용하면 행 전체가 한 번에 선택되지 않고, 개별 셀 단위로만 선택이 가능해집니다. 만약 특정 열만 편집 가능하게 하고 싶다면, editCellAt() 내부에서 column 값을 조건 검사하여 원하는 열에 대해서만 true를 반환하도록 확장할 수도 있습니다.