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

Java Swing에서 JComboBox 항목을 정렬하는 방법

JComboBoxJComponent 클래스의 하위 클래스로, 텍스트 필드와 사용자가 값을 선택할 수 있는 드롭다운 목록을 하나로 결합한 스윙(Swing) 컴포넌트입니다. 사용자가 콤보 박스를 조작하면 ActionListener, ChangeListener, ItemListener 인터페이스를 통해 이벤트를 처리할 수 있습니다.

JComboBox의 기본 정렬 미지원 문제

기본적으로 JComboBox는 항목(item) 자동 정렬 기능을 제공하지 않습니다. 따라서 항목이 추가된 순서대로 그대로 표시됩니다. 이 문제를 해결하려면 DefaultComboBoxModel 클래스를 상속하여 정렬 로직을 직접 구현한 커스텀 모델을 만들어야 합니다.

핵심 아이디어는 다음과 같습니다.

  • 생성자에서 배열(Arrays.sort()) 또는 벡터(Collections.sort())를 먼저 정렬한 뒤 모델에 추가합니다.
  • insertElementAt() 메서드를 오버라이드하여 새 항목이 추가될 때마다 Comparable.compareTo()를 이용해 올바른 위치에 삽입합니다.
  • 이렇게 하면 실행 중에 항목을 동적으로 추가해도 항상 사전순으로 정렬된 상태가 유지됩니다.

전체 예제 코드

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

public class JComboBoxSorterTest extends JFrame {
    private JComboBox comboBox;
    private JTextField textField;

    public JComboBoxSorterTest() {
        setTitle("JComboBoxSorter Test");
        setLayout(new FlowLayout());

        textField = new JTextField(10);
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                comboBox.addItem(textField.getText());
                textField.setText("");
                comboBox.showPopup();
            }
        });

        String[] items = {"raja", "archana", "vineet", "krishna", "adithya"};
        SortedComboBoxModel model = new SortedComboBoxModel(items);
        comboBox = new JComboBox(model);
        comboBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

        Box box1 = Box.createHorizontalBox();
        box1.add(new JLabel("Enter a name and hit enter "));
        box1.add(textField);

        Box box2 = Box.createHorizontalBox();
        box2.add(comboBox);

        add(box1);
        add(box2);
        setSize(375, 250);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    // JComboBox 항목 정렬을 위한 커스텀 모델
    private class SortedComboBoxModel extends DefaultComboBoxModel {
        public SortedComboBoxModel() {
            super();
        }

        public SortedComboBoxModel(Object[] items) {
            Arrays.sort(items);
            int size = items.length;
            for (int i = 0; i < size; i++) {
                super.addElement(items[i]);
            }
            setSelectedItem(items[0]);
        }

        public SortedComboBoxModel(Vector items) {
            Collections.sort(items);
            int size = items.size();
            for (int i = 0; i < size; i++) {
                super.addElement(items.elementAt(i));
            }
            setSelectedItem(items.elementAt(0));
        }

        public void addElement(Object element) {
            insertElementAt(element, 0);
        }

        public void insertElementAt(Object element, int index) {
            int size = getSize();
            for (index = 0; index < size; index++) {
                Comparable c = (Comparable) getElementAt(index);
                if (c.compareTo(element) > 0) {
                    break;
                }
            }
            super.insertElementAt(element, index);
        }
    }

    public static void main(String[] args) {
        new JComboBoxSorterTest();
    }
}

코드 동작 방식

프로그램을 실행하면 초기 항목인 raja, archana, vineet, krishna, adithya가 이미 사전순으로 정렬되어 콤보 박스에 표시됩니다. 텍스트 필드에 새 이름을 입력하고 엔터 키를 누르면 해당 항목이 모델에 추가되면서 즉시 알맞은 위치에 삽입되어 정렬 상태가 유지됩니다.

setPrototypeDisplayValue() 메서드는 드롭다운 목록의 너비가 항목 길이에 따라 계속 변하는 것을 방지하기 위해 기준이 되는 표시 값을 지정하는 용도로 사용됩니다.

실행 결과

Java Swing에서 JComboBox 항목을 정렬하는 방법

위 결과에서 볼 수 있듯이, 입력된 이름들이 추가 순서와 관계없이 항상 오름차순으로 정렬되어 표시되는 것을 확인할 수 있습니다. 이 방식은 DefaultComboBoxModel만 상속하면 되므로 기존 코드에 최소한의 변경으로 적용할 수 있다는 장점이 있습니다.