JPopupMenu는 화면의 어느 위치에서든 마우스 오른쪽 버튼을 클릭했을 때 나타나는 메뉴입니다. 텍스트 편집기나 파일 탐색기에서 흔히 볼 수 있는 컨텍스트 메뉴(단축 메뉴)를 Java Swing으로 손쉽게 만들 수 있습니다.
JPopupMenu의 개념
- 팝업 메뉴는 화면에 자유롭게 떠 있는(free-floating) 메뉴로, 이를 호출한 기반이 되는 컴포넌트를 인보커(invoker)라고 부릅니다.
- 대부분의 경우 팝업 메뉴는 특정 컴포넌트에 연결되어, 해당 컴포넌트와 관련된 상황별(컨텍스트 감지형) 선택 옵션을 보여주는 역할을 합니다.
- 팝업 메뉴를 생성하려면 JPopupMenu 클래스를 사용하며, 일반 메뉴와 마찬가지로 JMenuItem 객체를 추가할 수 있습니다.
- 팝업 메뉴를 화면에 표시하려면 show() 메서드를 호출합니다. 보통 팝업 메뉴는 마우스 이벤트에 대한 응답으로 호출됩니다.
구현 시 주요 포인트
마우스 이벤트가 실제로 팝업 메뉴를 띄워야 하는 이벤트인지 확인하려면 isPopupTrigger() 메서드를 사용합니다. 운영체제마다 팝업 트리거가 발생하는 시점(Windows/Linux는 마우스 릴리즈, macOS는 마우스 프레스)이 다르기 때문에, 이 메서드를 활용하면 플랫폼에 관계없이 안정적으로 동작하는 코드를 작성할 수 있습니다.
예제 코드
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class JPopupMenuTest extends JFrame {
private JPopupMenu popup;
public JPopupMenuTest() {
setTitle("JPopupMenu Test");
Container contentPane = getContentPane();
popup = new JPopupMenu();
// 팝업 메뉴에 메뉴 항목 추가
popup.add(new JMenuItem("Cut"));
popup.add(new JMenuItem("Copy"));
popup.add(new JMenuItem("Paste"));
popup.addSeparator();
popup.add(new JMenuItem("SelectAll"));
// 마우스 이벤트 리스너 등록
contentPane.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent me) {
showPopup(me); // showPopup()은 직접 정의한 사용자 메서드
}
});
setSize(375, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
void showPopup(MouseEvent me) {
if (me.isPopupTrigger())
popup.show(me.getComponent(), me.getX(), me.getY());
}
public static void main(String args[]) {
new JPopupMenuTest();
}
}코드 설명
- 팝업 메뉴 생성:
JPopupMenu객체를 만들고Cut,Copy,Paste메뉴 항목을 추가한 뒤,addSeparator()로 구분선을 넣고SelectAll항목을 추가했습니다. - 마우스 리스너 등록: 콘텐츠 패널에
MouseAdapter를 등록하여 마우스 버튼을 놓았을 때showPopup()메서드가 호출되도록 했습니다. - 팝업 표시 조건 확인:
isPopupTrigger()가 true를 반환하면, 즉 오른쪽 클릭 이벤트라면popup.show()를 호출해 마우스가 클릭된 좌표(getX(),getY())에 팝업 메뉴를 표시합니다.
실행 결과
프로그램을 실행하고 프레임 내부에서 마우스 오른쪽 버튼을 클릭하면, 클릭한 위치에 Cut, Copy, Paste, SelectAll 항목이 포함된 팝업 메뉴가 나타납니다.

이처럼 JPopupMenu와 마우스 이벤트만 활용하면 별도의 라이브러리 없이도 사용자에게 익숙한 오른쪽 클릭 컨텍스트 메뉴를 간단하게 구현할 수 있습니다. 필요에 따라 메뉴 항목에 액션 리스너를 추가해 각 명령의 실제 동작을 연결하면 완성도 높은 UI를 만들 수 있습니다.