Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例

JComboBoxJComponentクラスのサブクラスであり、テキストフィールドと、ユーザーが値を選択できるドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーがコンボボックスを操作すると、ActionListenerChangeListenerItemListenerといったインターフェースを通じてイベントを受け取ることができます。

ただし、標準のJComboBoxにはアイテムを並べ替える(ソートする)機能は用意されていません。そこで本記事では、DefaultComboBoxModelクラスを継承した独自のモデルクラスを作成し、コンボボックスの項目を常に整序された状態で表示する方法を解説します。

ソート対応JComboBoxのサンプルコード

以下の例では、テキストフィールドに名前を入力してEnterキーを押すと、その項目がコンボボックスに追加され、自動的にアルファベット順に並べ替えられます。

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();
    }
}

コードのポイント解説

  • SortedComboBoxModelクラス:DefaultComboBoxModelを継承し、ソート機能を持つカスタムモデルとして定義しています。
  • コンストラクタでの初期ソート:配列の場合はArrays.sort()、Vectorの場合はCollections.sort()を使って、初期アイテムをあらかじめ整序してから登録します。
  • insertElementAt()のオーバーライド:新しい要素を追加する際に、既存の要素とcompareTo()で比較しながら適切な挿入位置を求めることで、常に昇順の並びを維持します。
  • setPrototypeDisplayValue():ポップアップリストの幅が項目によって変動しないよう、基準となる表示幅を設定しています。

実行結果

プログラムを実行すると、ウィンドウ上部のテキストフィールドに名前を入力してEnterキーを押すたびに、その項目がコンボボックスへ追加され、リスト全体が自動的にアルファベット順に並べ替えられて表示されます。

JavaでJComboBoxの項目をソートする方法!DefaultComboBoxModelのカスタマイズ例

  1. Java SwingのJButtonでHTMLテキストを実装する方法

    JButtonはAbstractButtonのサブクラスであり、Java Swingのコンポーネント階層において非常に重要な役割を担うクラスです。JButtonは、ログイン画面を持つアプリケーションなど、ユーザーに操作を促す場面で広く利用されています。ボタンを押下・クリックすると、ActionListenerインターフェースを通じてアクションイベントが発生し、それに応じた処理を実行できます。また、JButtonにはテキストのみ、アイコンのみ、あるいはテキストとアイコンの両方を設定することが可能です。さらに便利な点として、ボタンのラベルにHTMLタグを使用できるため、太字(bold)や斜体(it

  2. Javaで編集可能なJComboBoxを実装する方法【setEditable(true)の使い方を解説】

    JComboBoxとは JComboBoxはSwingが提供するGUIコンポーネントの一つで、JComponentクラスを継承しています。テキストフィールドとドロップダウンリストを組み合わせた部品であり、ユーザーはリストから値を選択することができます。 コントロールのテキストフィールド部分が編集可能に設定されている場合、ユーザーはフィールドに直接値を入力したり、ドロップダウンリストから取得した値を編集したりできます。 デフォルトでは、JComboBoxのテキストフィールド部分のデータは編集できないようになっています。ユーザーに編集を許可したい場合は、setEditable(true)メソッ