0

JComboboxにアイテムを追加したいのですが、そのアイテムは、追加するアイテムであるJComboboxに入力したものです。このjComboxボックスは編集可能です。

これどうやってするの。

このJComboボックスにKeyPressイベントを追加しようとしましたが、応答しません

 private void jbcBOXKeyTyped(java.awt.event.KeyEvent evt) {

        if (evt.getKeyCode() == 13) {
            System.out.println("Keypress");
            jbcBOX.addItem(jbcBOX.getSelectedItem().toString());
        }
    }
4

3 に答える 3

2

それが役立つことを願って短い例を作りました。

基本的には、アイテムが選択または追加ActionListenerJComboBoxれるActionListenerたびに呼び出されます。ここではActionListener、現在選択されているアイテムに一致するアイテムがあるかどうかを確認し、一致しない場合はアイテムを追加してJComboBox、一致するアイテムが見つかった場合は何もしません。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class EditableJComboBox {

    public EditableJComboBox() {
        initComponents();
    }

    private void initComponents() {
        JFrame frame = new JFrame("Editable JComboBox");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String labels[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};
        final JComboBox comboBox = new JComboBox(labels);
        comboBox.setEditable(true);

        comboBox.addActionListener(new ActionListener() {
            private boolean found = false;

            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                String s = (String) comboBox.getSelectedItem();
                for (int i = 0; i < comboBox.getItemCount(); i++) {
                    if (comboBox.getItemAt(i).toString().equals(s)) {
                        found = true;
                        break;
                    }
                }
                if (!found) {
                    System.out.println("Added: " + s);
                    comboBox.addItem(s);
                }
                found = false;
            }
        });

        frame.add(comboBox);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new EditableJComboBox();
            }
        });
    }
}
于 2012-11-22T18:32:01.927 に答える
1

これは、コンボボックスチュートリアルで説明されています。ダーティKeyListenerの必要はなく、エンターキーをチェックします。

  1. コンボボックスを編集可能にします
  2. ActionListenerエンターキーが押されたときにトリガーされるを追加します
  3. あなたの中でActionListenerあなたはモデルを更新することができます

または、そのチュートリアルをより文字通り引用する

JComboBox patternList = new JComboBox(patternExamples);
patternList.setEditable(true);
patternList.addActionListener(this);

編集可能なコンボボックスは、ユーザーがメニューから項目を選択したとき、およびユーザーがEnterキーを押したときに、アクションイベントを発生させます。ユーザーがコンボボックスに値を入力しても、メニューは変更されないことに注意してください。必要に応じて、ユーザーが一意の値を入力するたびにコンボボックスのメニューに新しい項目を追加するアクションリスナーを簡単に作成できます。

于 2012-11-22T18:19:10.017 に答える
1

これが言うよりも悪いです-(Netbeansを使用して)keyTypedなどのイベントは単に発生しないようです。多くの人がここで、なぜJTextFieldでjava.awt.event.KeyEvent.getKeyChar()をキャッチできるのか疑問に思っていると思いますが、JComboBoxにGUIビルダー(Netbeans)の対応する部分を正確に使用してもまったく何も得られません!

コンボボックスでのイベントの処理

..。

JComboBoxは、低レベルのイベント(たとえば、フォーカス、キー、マウスのイベント)のリスナーを登録するメソッドを継承しますが、コンボボックスで低レベルのイベントをリッスンしないことをお勧めします。その理由は次のとおりです。コンボボックスは複合コンポーネントであり、2つ以上の他のコンポーネントで構成されています。コンボボックス自体は、アクションイベントなどの高レベルのイベントを発生させます。そのサブコンポーネントは、マウス、キー、フォーカスイベントなどの低レベルのイベントを発生させます。低レベルのイベントとそれらを起動するサブコンポーネントは、ルックアンドフィールに依存します。ルックアンドフィールに依存するコードを記述しないようにするには、コンボボックスなどの複合コンポーネントで高レベルのイベントのみをリッスンする必要があります。高レベルおよび低レベルのイベントに関する説明など、イベントに関する情報については、「イベントリスナーの作成」を参照してください。

于 2016-04-07T17:23:15.583 に答える