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

Java Swing JTextArea에서 잘라내기·복사·붙여넣기 기능을 비활성화하는 방법

JTextAreaJTextComponent 클래스의 하위 클래스로, 여러 줄의 텍스트를 표시하거나 사용자가 직접 텍스트를 입력할 수 있도록 지원하는 멀티라인 텍스트 컴포넌트입니다. JTextArea의 기능을 확장해 구현할 때는 CaretListener 인터페이스를 통해 캐럿(커서) 위치 변화 같은 이벤트를 처리할 수 있습니다.

기본적으로 JTextArea는 잘라내기(Cut), 복사(Copy), 붙여넣기(Paste) 기능을 기본으로 제공합니다. 그러나 보안 정책이나 입력 제한 등의 이유로 이러한 편집 기능을 막아야 하는 경우가 있습니다. 이때 JTextArea 클래스의 getInputMap().put() 메서드를 사용하면 해당 단축키에 바인딩된 기본 동작을 손쉽게 비활성화할 수 있습니다.

핵심 원리

Swing은 키 입력을 KeyStroke 객체로 표현하며, InputMap을 통해 특정 KeyStroke와 ActionMap의 액션 이름을 연결합니다. 따라서 각 단축키를 "none"이라는 값에 매핑하면 해당 키 조합이 눌려도 아무 동작도 실행되지 않습니다.

  • 잘라내기: KeyStroke.getKeyStroke("control X")
  • 복사: KeyStroke.getKeyStroke("control C")
  • 붙여넣기: KeyStroke.getKeyStroke("control V")

getInputMap().put(keyStroke, "none") 형태로 호출하면 해당 키 조합에 연결된 기본 액션이 무시되므로, 잘라내기·복사·붙여넣기가 모두 차단됩니다.

예제 코드

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

public class JTextAreaCutCopyPasteDisableTest extends JFrame {
    private JTextArea textArea;
    private JButton cut, copy, paste;
    private JPanel panel;

    public JTextAreaCutCopyPasteDisableTest() {
        setTitle("JTextAreaCutCopyPasteDisable Test");
        setLayout(new BorderLayout());
        panel = new JPanel();
        textArea = new JTextArea();

        cut = new JButton("Cut");
        cut.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                // 잘라내기 비활성화
                textArea.getInputMap().put(KeyStroke.getKeyStroke("control X"), "none");
            }
        });
        panel.add(cut);

        copy = new JButton("Copy");
        copy.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                // 복사 비활성화
                textArea.getInputMap().put(KeyStroke.getKeyStroke("control C"), "none");
            }
        });
        panel.add(copy);

        paste = new JButton("Paste");
        paste.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                // 붙여넣기 비활성화
                textArea.getInputMap().put(KeyStroke.getKeyStroke("control V"), "none");
            }
        });
        panel.add(paste);

        add(panel, BorderLayout.NORTH);
        add(new JScrollPane(textArea), BorderLayout.CENTER);
        setSize(400, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

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

실행 결과

프로그램을 실행하면 상단에 Cut, Copy, Paste 버튼이 배치된 창이 나타납니다. 각 버튼을 클릭하면 텍스트 영역에서 대응하는 단축키(Ctrl+X, Ctrl+C, Ctrl+V) 기능이 하나씩 비활성화되어, 더 이상 해당 편집 동작이 수행되지 않습니다.


Java Swing JTextArea에서 잘라내기·복사·붙여넣기 기능을 비활성화하는 방법

추가 팁

위 방법은 키보드 단축키만 차단합니다. 만약 마우스 오른쪽 버튼 팝업 메뉴에 DefaultEditorKit의 잘라내기·복사·붙여넣기 액션을 직접 추가했다면, 팝업 메뉴에서 해당 메뉴 항목도 함께 제거하거나 setEnabled(false)로 비활성화해야 완전히 차단할 수 있습니다. 또한 프로그램 시작 시점(생성자)부터 기능을 막고 싶다면 버튼 리스너 없이 생성자 안에서 곧바로 getInputMap().put()을 호출하면 됩니다.