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

Java Swing JTree에서 마우스 오른쪽 버튼 클릭 팝업 메뉴 구현하기

JTreeJComponent 클래스의 하위 클래스로, 계층적(hierarchical) 속성을 가진 데이터를 화면에 표시할 때 사용됩니다. 노드를 다른 노드 아래에 추가하는 방식으로 부모-자식 관계를 유지하며, 트리를 구성하는 각 요소는 하나의 노드(node)가 됩니다. 이러한 노드들은 확장 및 축소(expandable/collapsible)가 가능합니다.

마우스 오른쪽 버튼 클릭 구현 원리

JTree의 각 노드에서 마우스 오른쪽 버튼 클릭 이벤트를 처리하려면 MouseAdapter 클래스의 mouseReleased() 메서드를 오버라이드하면 됩니다. 그리고 클릭 시점에 JPopupMenu 클래스의 show() 메서드를 호출하여 해당 트리 노드 위에 팝업 메뉴를 표시할 수 있습니다.

핵심 처리 흐름은 다음과 같습니다.

  • e.isPopupTrigger()로 마우스 이벤트가 팝업 메뉴를 띄우는 트리거인지 확인합니다.
  • 팝업 트리거라면 JPopupMenu.show(Component, x, y)를 호출해 클릭된 위치에 메뉴를 표시합니다.

예제 코드

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

public class JTreeRightClickTest extends JFrame {
    public JTreeRightClickTest() {
        DefaultMutableTreeNode root = createNodes();
        JTree tree = new JTree(root);
        final TreePopup treePopup = new TreePopup(tree);
        tree.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent e) {
                if(e.isPopupTrigger()) {
                    treePopup.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });
        add(new JScrollPane(tree), BorderLayout.NORTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        setVisible(true);
    }
    public static DefaultMutableTreeNode createNodes() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Technology");
        DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("Java");
        DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("Python");
        DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("Selenium");
        node1.add(new DefaultMutableTreeNode("Programming Language"));
        node2.add(new DefaultMutableTreeNode("Programming Language"));
        node3.add(new DefaultMutableTreeNode("Testing Framework"));
        root.add(node1);
        root.add(node2);
        root.add(node3);
        return root;
    }
    public static void main(String args[]) {
        new JTreeRightClickTest();
    }
}

class TreePopup extends JPopupMenu {
    public TreePopup(JTree tree) {
        JMenuItem delete = new JMenuItem("Delete");
        JMenuItem add = new JMenuItem("Add");
        delete.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                System.out.println("Delete child");
            }
        });
        add.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                System.out.println("Add child");
            }
        });
        add(delete);
        add(new JSeparator());
        add(add);
    }
}

코드 설명

  • createNodes(): "Technology"를 루트로 하는 트리 구조를 생성하고, Java·Python·Selenium 등의 자식 노드를 추가합니다.
  • MouseAdapter: 불필요한 빈 메서드 구현 없이 필요한 mouseReleased()만 오버라이드하여 코드를 간결하게 유지합니다.
  • isPopupTrigger(): 운영체제마다 팝업 메뉴가 열리는 방식이 다르므로(Windows는 마우스 놓기, macOS는 누르기), 이 메서드를 사용하면 플랫폼에 관계없이 일관되게 동작합니다.
  • TreePopup 클래스: JPopupMenu를 상속받아 "Delete"와 "Add" 메뉴 항목을 구성하고, 각 항목에 ActionListener를 등록해 선택 시 콘솔에 결과를 출력합니다.

실행 결과

프로그램을 실행하면 계층 구조로 표시된 트리가 나타나고, 임의의 노드에서 마우스 오른쪽 버튼을 클릭하면 해당 위치에 "Delete"와 "Add" 항목이 포함된 팝업 메뉴가 표시됩니다.