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

Javaでオートコンプリート機能付きJComboBoxを実装する方法


JComboBoxJComponentクラスのサブクラスで、テキストフィールドとドロップダウンリストを組み合わせたSwingコンポーネントです。ユーザーはリストから値を選択できるほか、コンボボックスへの操作に応じてActionListenerChangeListenerItemListenerなどのインターフェースにイベントを発生させることもできます。

キーボードからの入力に対してオートコンプリート(自動補完)機能を持つJComboBoxを実装するには、JComboBoxクラスを継承したカスタムクラス(AutoCompleteComboBox)を作成します。このクラスでは、エディタコンポーネントにKeyListenerを追加し、ユーザーが文字を入力するたびにリスト内の先頭一致する項目を検索して、自動的に選択・補完を行う仕組みを実装しています。

実装例

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class AutoCompleteComboBoxTest extends JFrame {
    private JComboBox comboBox;

    public AutoCompleteComboBoxTest() {
        setTitle("AutoCompleteComboBox");
        String[] countries = new String[] {"india", "australia", "newzealand", "england", "germany",
            "france", "ireland", "southafrica", "bangladesh", "holland", "america"};
        comboBox = new AutoCompleteComboBox(countries);
        add(comboBox, BorderLayout.NORTH);
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

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

// AutoCompleteComboBoxの実装
class AutoCompleteComboBox extends JComboBox {
    public int caretPos = 0;
    public JTextField tfield = null;

    public AutoCompleteComboBox(final Object countries[]) {
        super(countries);
        setEditor(new BasicComboBoxEditor());
        setEditable(true);
    }

    public void setSelectedIndex(int index) {
        super.setSelectedIndex(index);
        tfield.setText(getItemAt(index).toString());
        tfield.setSelectionEnd(caretPos + tfield.getText().length());
        tfield.moveCaretPosition(caretPos);
    }

    public void setEditor(ComboBoxEditor editor) {
        super.setEditor(editor);
        if(editor.getEditorComponent() instanceof JTextField) {
            tfield = (JTextField) editor.getEditorComponent();
            tfield.addKeyListener(new KeyAdapter() {
                public void keyReleased(KeyEvent ke) {
                    char key = ke.getKeyChar();
                    if (!(Character.isLetterOrDigit(key) || Character.isSpaceChar(key))) return;
                    caretPos = tfield.getCaretPosition();
                    String text = "";
                    try {
                        text = tfield.getText(0, caretPos);
                    } catch (javax.swing.text.BadLocationException e) {
                        e.printStackTrace();
                    }
                    for (int i = 0; i < getItemCount(); i++) {
                        String element = (String) getItemAt(i);
                        if (element.startsWith(text)) {
                            setSelectedIndex(i);
                            return;
                        }
                    }
                }
            });
        }
    }
}

実装のポイント

  • setEditable(true):コンボボックスを編集可能にし、ユーザーがキーボードから直接入力できるようにします。
  • BasicComboBoxEditor:標準のエディタコンポーネント(JTextField)を取得するために使用します。
  • keyReleasedイベント:キーが離されたタイミングで入力済みの文字列を取得し、候補の検索を開始します。
  • startsWith()メソッド:入力された文字列で始まる項目をリストから先頭一致で検索します。
  • moveCaretPosition():補完された部分を選択状態にすることで、続けて入力された文字が補完部分を自然に上書きするように制御します。

実行結果

プログラムを実行すると、入力した文字に応じて国名が自動補完されるコンボボックスが表示されます。例えば「a」と入力すると「australia」や「america」など、先頭が一致する項目が候補として補完され、残りの文字列が選択状態になります。このまま文字を入力し続ければ候補は絞り込まれ、Backspaceなどで文字を削除すれば再び広い範囲から候補がマッチします。

Javaでオートコンプリート機能付きJComboBoxを実装する方法

  1. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー

  2. JavaのJWindowを使ってスプラッシュ画面を実装する方法

    JWindowは、デスクトップ上の任意の位置に表示できるコンテナです。JFrameと異なり、タイトルバーやウィンドウ管理ボタンなどの装飾要素を持ちません。JWindowは、唯一の子クラスとしてJRootPaneを含んでいます。そのcontentPaneが、JWindowに追加される子コンポーネントの親となります。JFrameと同様に、JWindowもトップレベルコンテナの一つであり、「装飾のない(undecorated)JFrame」と考えることができます。タイトルバーやウィンドウメニューといった機能は備えていません。この特性を活かすと、JWindowはスプラッシュ画面として利用できます。アプ