2016-03-22 8 views
0

編集可能なコンボボックスを使用して、ユーザーからのキーストロークでデータベースからクライアントをクイック検索する機能を作成しようとしています。私が持っていたかったのは、ユーザーがいくつかの文字を入力し、それらの文字が一部のクライアントと一致すると、それらのクライアントはコンボボックスの現在のデータモデルにとどまります。
コードは次のとおりです。 コード内で発生した例外を修正してください。前もって感謝します !!スレッド "AWT-EventQueueの-0" java.lang.IllegalStateExceptionでこのコードでIllegalStateExceptionが発生しました

例外:通知

import java.util.ArrayList; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.event.CaretEvent; 
import javax.swing.event.CaretListener; 

class ComboSearch extends JFrame implements CaretListener 
{ 
    private JComboBox mycombo; 
    private ArrayList<String> list; 
    private DefaultComboBoxModel<String> isolatemodel,model; 

public ComboSearch() 
{ 
    setSize(400, 400); 
    setLayout(null); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    mycombo=new JComboBox(); 
    mycombo.setEditable(true); 
    mycombo.setBounds(30,30, 350, 50); 
    isolatemodel=new DefaultComboBoxModel(); 
    model=new DefaultComboBoxModel(); 
    list=new ArrayList(); 
    add(mycombo); 
    mycombo.setModel(isolatemodel); 
    ((JTextField)mycombo.getEditor() 
     .getEditorComponent()).addCaretListener(this); 
    setVisible(true);} 

    private void addElements() 
    { 
    list.add("Rambhau, Vijay Nagar"); 
    list.add("Surya, Ashok Puri"); 
    list.add("Mourya, Shahjapur"); 
    list.add("Kishorji & sons, Bhopal"); 
    list.add("Fablica & jewels, Itanagar"); 
    list.add("Guru Kripa,Ujjain"); 
    list.add("Hariram Nai & Bakes, Indore"); 
    list.add("Ganesh Sev Bhandar, Harda"); 
    list.add("Greatsome Higs, Jabalpur"); 
    list.add("Treks and hains, Nalanda"); 
    list.add("Tata Indora, Hoshangabad"); 
    list.add("Paankhai Seth, Madurai"); 
    list.add("Katappa, Shikara"); 
    list.add("Gunjan Samosa, Vijay Nagar"); 
    list.add("Ramesh hustlers , Vijay Nagar"); 
    } 
    public void makeModels() 
    { 
    addElements(); 
    list.stream().forEach((client) -> { 
     isolatemodel.addElement(client); 
    }); 
    } 

    @Override 
    public void caretUpdate(CaretEvent e) 
    { 
    String searchText=((JTextField)mycombo.getEditor() 
          .getEditorComponent()).getText(); 

    if(!searchText.isEmpty()) 
    { 
     for(int i=0; i<isolatemodel.getSize();i++) 
     { 
      if(isolatemodel.getElementAt(i).contains(searchText)) 
      { 
       model.removeAllElements(); 
       model.addElement(isolatemodel.getElementAt(i)); 
      } 
     } 
     mycombo.setModel(model); 
     mycombo.showPopup(); 
    } 
    else 
    { 
     mycombo.setModel(isolatemodel); 
    } 
    } 
} 


public class Execute 
{ 
    public static void main(String[] args) 
    { 
    ComboSearch searchIt=new ComboSearch(); 
    searchIt.makeModels(); 
    } 
} 
+0

まず、レイアウトを「null」に設定しないでください。それは問題を求めているだけです。代わりに[Layout Manager](https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html)を使用してください。 – Jonah

+0

また、 '.contains()'メソッドがないというエラーが表示されますこのif文 'if(isolatemodel.getElementAt(i).contains(searchText)) ' – Jonah

+0

私はレイアウトマネージャも使用しています。 –

答えて

2
model.removeAllElements(); 
model.addElement(isolatemodel.getElementAt(i)); 

及びそれらのletttersは、いくつかのクライアントと一致した場合に突然変異する試みこれらのクライアントは現在のデータモデルに残ります。

それで、マッチを見つけるたびにすべてのアイテムを削除するのは意味がありません。その後、コンボボックスに1つのエントリしか残されません。

ループ処理を開始してから、一致する要素を追加する前に、すべての項目を削除する必要があります。

はIllegalStateException:

あなたは、入力されたイベントの処理は、処理が完了する前に、コンボボックスモデルを更新しようとしています。

リスナーのコードをSwingUtiltities.invokeLater(...)にラップすると、すべての処理が完了した後にコードが実行されます。

また、通常、DocuementListenerを使用して、エディタのテキストが変更されたときに通知されます.CaretListenerでは変更されません。ユーザーは、矢印キーを使用してキャレットを移動することができ、その場合、モデルを更新する必要はありません。

+0

私は1つだけのエントリが残っているだろう任意のcharsequence入力??さらに、その空の場合にremoveAll文を実行しないと、そのサイズのモデルにチェックを入れてみました。私も同じ例外があります。 DocumentListenerを使用するヒントについてはありがとうございます。 –

+0

新しい要素を追加する前に、以前に追加した項目をすべて削除してリストをクリアします。最後にclearを呼び出すまでこれを何度もやり直してから、1つの要素を追加してforループを終了させます – Jonah

+0

'if(model.getSize!= 0){model.addAlement() isolatemodel.getElementAt(i));これは、モデルが非公開の状態になっていないことを保証するために行うことができますか? –

関連する問題