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

Java Swing JComboBox에서 각 항목을 서로 다른 글꼴로 표시하는 방법

JComboBox란 무엇인가?

JComboBoxJComponent 클래스를 상속받는 스윙(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에 적용합니다.
  • 결과: 드롭다운 목록을 펼치면 각 항목이 자신의 실제 글꼴 스타일로 표시되어 시각적인 미리보기 효과를 얻을 수 있습니다.

실행 결과

프로그램을 실행하면 콤보 박스를 클릭했을 때 각 항목이 고유한 글꼴로 렌더링되는 것을 확인할 수 있습니다.

Java Swing JComboBox에서 각 항목을 서로 다른 글꼴로 표시하는 방법