JComboBox란 무엇인가?
JComboBox는 JComponent 클래스를 상속받는 스윙(Swing) 컴포넌트로, 텍스트 필드와 드롭다운 목록이 결합된 형태입니다. 사용자가 콤보 박스에서 값을 선택할 수 있도록 해주며, 사용자의 동작에 반응하여 ActionListener, ChangeListener, ItemListener 인터페이스의 이벤트를 발생시킬 수 있습니다.
ListCellRenderer로 글꼴 미리보기 구현하기
기본 상태의 JComboBox는 모든 항목을 동일한 글꼴로 렌더링합니다. 하지만 ListCellRenderer 인터페이스를 구현한 사용자 정의 렌더러를 적용하면, 각 항목마다 해당 글꼴 이름을 그대로 화면에 미리 보여줄 수 있습니다. 이는 폰트 선택기(Font Picker)를 만들 때 매우 유용한 기법입니다.
핵심 아이디어는 다음과 같습니다.
- 시스템에 설치된 글꼴 목록을
GraphicsEnvironment.getAvailableFontFamilyNames()로 가져옵니다. - JLabel을 상속받아 ListCellRenderer를 구현한 렌더러 클래스를 작성합니다.
getListCellRendererComponent()메서드 안에서 항목의 텍스트를 설정하고, 그 이름에 해당하는Font객체를 생성해 직접 적용합니다.
예제 코드
import java.awt.*;
import javax.swing.*;
public class JComboBoxFontTest extends JFrame {
private JComboBox fontComboBox;
private String fontName[];
private Integer array[];
public JComboBoxFontTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 시스템에 설치된 모든 글꼴 패밀리 이름 가져오기
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
fontName = ge.getAvailableFontFamilyNames();
array = new Integer[fontName.length];
for (int i = 1; i <= fontName.length; i++) {
array[i-1] = i;
}
fontComboBox = new JComboBox(array);
ComboBoxRenderar renderar = new ComboBoxRenderar();
fontComboBox.setRenderer(renderar); // 사용자 정의 렌더러 적용
setLayout(new FlowLayout());
add(fontComboBox);
setSize(400, 300);
setLocationRelativeTo(null);
setVisible(true);
}
// 각 항목을 해당 글꼴로 그려주는 렌더러
private class ComboBoxRenderar extends JLabel implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
int offset = ((Integer)value).intValue() - 1;
String name = fontName[offset];
setText(name); // 글꼴 이름 표시
setFont(new Font(name, Font.PLAIN, 20)); // 해당 글꼴로 렌더링
return this;
}
}
public static void main(String args[]) {
new JComboBoxFontTest();
}
}
코드 설명
- 글꼴 목록 조회: GraphicsEnvironment를 통해 OS에 설치된 글꼴 패밀리 이름 배열을 얻어옵니다.
- 렌더러 등록: setRenderer() 메서드로 기본 렌더러 대신 ComboBoxRenderar를 지정합니다.
- 항목 렌더링: getListCellRendererComponent()가 호출될 때마다 항목의 텍스트를 글꼴 이름으로 설정하고, new Font(name, Font.PLAIN, 20)으로 생성한 글꼴을 JLabel에 적용합니다.
- 결과: 드롭다운 목록을 펼치면 각 항목이 자신의 실제 글꼴 스타일로 표시되어 시각적인 미리보기 효과를 얻을 수 있습니다.
실행 결과
프로그램을 실행하면 콤보 박스를 클릭했을 때 각 항목이 고유한 글꼴로 렌더링되는 것을 확인할 수 있습니다.
