2016-03-22 51 views
0

我正在嘗試使用可編輯的組合框在用戶的某些擊鍵上從數據庫快速搜索客戶端的功能。我想要的是,用戶會輸入一些字母,如果這些字符串與某些客戶端匹配,這些客戶端將保留在當前的組合框的數據模型中。
代碼如下。 請修復代碼中發生的異常。提前致謝 !!我在此代碼中收到IllegalStateException

異常在線程 「AWT-EventQueue的 - 0」 java.lang.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。這只是要求問題。使用[佈局管理器](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比賽與一些客戶端,那些客戶端將保留在當前的數據模型中

那麼,每當你找到一場比賽時,移除所有物品是沒有意義的。然後,您將只有一個條目留在組合框中。

您需要在開始循環處理之前刪除所有項目,然後添加回匹配的元素。

IllegalStateException異常:

您正在嘗試輸入事件的處理之前更新組合框模型已完成處理。

將代碼包裝在SwingUtiltities.invokeLater(...)的監聽器中,代碼將在所有處理完成後執行。

此外,您通常會在編輯器文本發生更改時通知使用DocuementListener,而不是CaretListener。用戶可以使用箭頭鍵移動插入符號,因此在這種情況下無需更新模型。

+0

你是如何確定我將只剩下一個條目任何charsequence輸入?此外,我已經嘗試把檢查模型的大小,如果它的空然後不執行removeAll語句。那麼我也有同樣的例外。並感謝您使用DocumentListener的提示。 –

+0

那麼每次在添加一個新元素之前,您都要清除列表,刪除之前添加的項目。如果(model.getSize!= 0){model.removeAllElements();} model.addElement()返回一個元素,並且for循環被退出 – Jonah

+0

' isolatemodel.getElementAt(i));'這可以做什麼來確保模型不處於非法運行狀態? –

相關問題