2016-03-22 12 views
0

Ich versuche, eine Funktion für die schnelle Suche von Clients aus der Datenbank auf einige Tastenanschläge vom Benutzer, mit einer bearbeitbaren Combobox. Was ich haben wollte, ist, dass der Benutzer einige Buchstaben einfügt und wenn diese Buchstaben mit einigen Clients übereinstimmen, bleiben diese Clients im aktuellen Datenmodell der Combobox.
Der Code ist wie folgt. Bitte beheben Sie die im Code auftretende Ausnahme. Danke im Voraus !!Ich bekomme eine IllegalStateException in diesem Code

Exception in thread "AWT-Eventqueue-0" java.lang.IllegalStateException: Versuch Benachrichtigung

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

Als erstes setzen Sie das Layout nicht auf 'null'. Das fragt nur nach Problemen. Verwenden Sie stattdessen einen [Layout Manager] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) – Jonah

+0

Ich bekomme auch einen Fehler, dass es keine '.contains()' Methode in gibt Diese if-Anweisung 'if (isolatemodel.getElementAt (i) .contains (searchText))' – Jonah

+0

Ich habe auch den Layout-Manager verwendet. Es ist nicht mit dem :( –

Antwort

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

und wenn diejenigen lettters Spiel mit einigen Kunden zu mutieren Diese Clients bleiben im aktuellen Datenmodell

Naja, dann ist es nicht sinnvoll, alle Elemente jedes Mal zu entfernen, wenn Sie eine Übereinstimmung finden. Dann haben Sie immer nur einen Eintrag in der Combobox.

Sie müssen alle Elemente entfernen, BEVOR Sie mit der Schleifenverarbeitung beginnen, und dann einfach die entsprechenden Elemente hinzufügen.

Illegal:

Sie versuchen die Combo-Box-Modell vor der Verarbeitung des typisierten Ereignis zu aktualisieren beendet die Verarbeitung.

Wickeln Sie den Code in den Listener in einem SwingUtiltities.invokeLater(...), um den Code ausgeführt werden, nachdem alle Verarbeitung abgeschlossen wurde.

Außerdem würden Sie normalerweise einen DocuementListener verwenden, um benachrichtigt zu werden, wenn sich der Text des Editors geändert hat, kein CaretListener. Der Benutzer könnte die Pfeiltasten verwenden, um das Caret zu verschieben, sodass das Modell in diesem Fall nicht aktualisiert werden muss.

+0

wie Sie sind so sicher dass ich nur noch einen Eintrag übrig hätte jede Charsequenzeingabe ?? Außerdem habe ich versucht, das Modell auf seine Größe zu überprüfen, wenn es leer ist, dann führe removeAll nicht aus. dann habe ich auch die selbe ausnahme. und ja danke für den Tipp, DocumentListener zu benutzen. –

+0

Nun, jedes Mal, bevor Sie ein neues Element hinzufügen, löschen Sie die Liste und entfernen alle zuvor hinzugefügten Elemente. Du machst das immer und immer wieder bis zum letzten, wo clear aufgerufen wird, dann fügst du ein Element hinzu und die for-Schleife wird beendet. – Jonah

+0

'if (model.getSize! = 0) {model.removeAllElements();} model.addElement (isolatemodel.getElementAt (i)); Dies ist, was getan werden kann, um sicherzustellen, dass das Modell nicht in Illegal-Zustand betrieben werden soll? –

Verwandte Themen