JList는 JComponent 클래스의 하위 클래스로, 사용자가 목록에서 하나 또는 여러 개의 항목을 선택할 수 있도록 객체 목록을 화면에 표시하는 데 사용됩니다. JList는 ListSelectionListener 인터페이스를 통해 선택 이벤트를 처리할 수 있으며, 이때 추상 메서드인 valueChanged()를 반드시 구현해야 합니다.
한편 JToolTip 클래스는 특정 컴포넌트 위에 마우스를 올렸을 때 간단한 설명 문구(팁)를 보여 주는 역할을 합니다. 일반적으로 컴포넌트 전체에는 setToolTipText() 메서드 하나로 툴팁을 지정하지만, 리스트처럼 항목이 여러 개인 경우에는 항목마다 다른 툴팁을 보여 주어야 할 때가 많습니다. 이럴 때는 JList를 상속하는 익명 클래스에서 getToolTipText(MouseEvent) 메서드를 재정의(오버라이드)하면 마우스가 위치한 항목의 인덱스에 맞는 툴팁을 동적으로 반환할 수 있습니다.
핵심 포인트
- getToolTipText() 메서드 안에서 locationToIndex()를 호출해 마우스 좌표에 해당하는 항목의 인덱스를 얻습니다.
- 유효한 인덱스(index > -1)라면 해당 항목의 데이터를 가져와 원하는 툴팁 문자열을 만들어 반환합니다.
- 툴팁 기능이 활성화되도록 반드시 setToolTipText("")를 호출해야 한다는 점을 잊지 마세요. 이 호출이 없으면 getToolTipText()가 아무리 재정의되어도 툴팁이 나타나지 않습니다.
예제 코드
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class JListTooltipTest extends JFrame {
private Vector vector;
public JListTooltipTest() {
setTitle("JListTooltip Test");
setLayout(new FlowLayout());
vector = new Vector();
for (int i=1; i < 15; i++) {
vector.addElement("Item #" + i);
}
final JList list = new JList(vector) {
public String getToolTipText(MouseEvent me) {
int index = locationToIndex(me.getPoint());
if (index > -1) {
String item = (String) getModel().getElementAt(index);
return "Tooltip for " + item;
}
return null;
}
};
list.setToolTipText("");
add(new JScrollPane(list));
setSize(375, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new JListTooltipTest();
}
}실행 결과
프로그램을 실행하면 1번부터 14번까지의 항목이 담긴 JList가 스크롤 패널과 함께 표시됩니다. 이 상태에서 마우스를 특정 항목 위에 올려 두면, 해당 항목 이름을 포함한 툴팁(예: "Tooltip for Item #5")이 자동으로 나타납니다. 즉, 리스트 전체가 아닌 항목 단위로 서로 다른 툴팁이 동적으로 출력되는 것을 확인할 수 있습니다.
이 방식은 파일 탐색기에서 파일 정보를 보여 주거나, 목록 항목별로 추가 설명이 필요한 UI를 만들 때 매우 유용하게 활용됩니다.